Avatar
omochimetaru 9/20/2023 2:05 AM
https://github.com/vapor/fluent-kit/blob/main/Sources/FluentKit/Concurrency/Database%2BConcurrency.swift#L4-L10 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)
2:06 AM
↑この transaction 関数の引数の closure って、 @Sendable@escaping も外していいと思うんですけど、正しい考えですかね?
2:06 AM
理由は、 self.transaction が返す EventLoopFutureawait future.get() して待機しているから、 この transaction メソッドが終了する時点では、必ず closure の呼び出しも終了しているからです。
2:08 AM
closure はEventLoopスレッドで実行されるのでconcurrency boundaryは跨いでるけど、 この transaction メソッド自体が async で、呼び出し側は必ず await で待たないといけないし。
2:09 AM
let closure = { (db) in ... } Task { closure() } try await db.transaction(closure) ↑呼び出し側で勝手にこういうふうにする事ができるか・・・? でもこの場合は、let closure の時点で @Sendable にしないと Task に渡せないから、この心配もないか