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() }
(edited)transaction
関数の引数の closure
って、 @Sendable
も @escaping
も外していいと思うんですけど、正しい考えですかね?self.transaction
が返す EventLoopFuture
を await future.get()
して待機しているから、 この transaction
メソッドが終了する時点では、必ず closure
の呼び出しも終了しているからです。closure
はEventLoopスレッドで実行されるのでconcurrency boundaryは跨いでるけど、 この transaction
メソッド自体が async
で、呼び出し側は必ず await
で待たないといけないし。let closure = { (db) in ... } Task { closure() } try await db.transaction(closure)
↑呼び出し側で勝手にこういうふうにする事ができるか・・・? でもこの場合は、let closure
の時点で @Sendable
にしないと Task
に渡せないから、この心配もないか