Avatar
omochimetaru 4/15/2024 1:35 AM
過去のこれ、誤りに気がついた https://discord.com/channels/291054398077927425/306995750418513920/1153874527114231809 public extension Database { func transaction<T>(_ closure: @Sendable @escaping (Database) async throws -> T) async throws -> T { try await self.transaction { db -> EventLoopFuture<T> in let promise = self.eventLoop.makePromise(of: T.self) promise.completeWithTask{ try await closure(db) } return promise.futureResult }.get() } この closure から @Sendable は外せない。 理由は、 closureEventLoopFuture の中で実行されている間に、 この executor は await しているだけでブロックはされていないから。 例えば closureActor の中にあった場合、 Actor のメソッド自体は interleave するから、同じisolationからこの closure を呼び出される可能性があって、 EventLoop threadとの並行実行になりうる。