WWDC 2021 が始まりました。 今年は Swift 5.5 で並行処理の大型アップデートが予定 されており、長年待ち望まれていた async/await
に加えて、さらに先進的な Structured Concurrency や Actor なども導入されます。そのため、 WWDC 2021 では並行処理関連のセッションが多数予定されています。
そこで、セッション一覧から並行処理関連のものを探して一覧にしてみました。内容はまだわかりませんが、個人的に重要度が高そうだと思う順に並べてみました。各セッション下部のリンクは内容に関係しそうな Proposal です。 (感想) は実際にそのセッションを見た感想です。
もし抜け漏れなどあればコメント下さい🙇
What‘s new in Swift
これは並行処理についてのセッションではないですが、 Swift 5.5 での新機能の大きな割合を並行処理関連のものが占めているので、最初にこれを見ることで全体を見渡すことができると思います。
(感想) Swift Evolution の Proposal のまとめだけでなく、 Swift 関連のニュース(たとえば Swift Collections や Swift Algorithms のようなライブラリ)の網羅的なダイジェストになっていてとても良かったです。各項目の詳細は他のセッションに橋渡しされており、並行処理関連でも本記事で次に挙げている三つのセッションが紹介されていました。まずはこれを見て全体像を掴むと良いと思います。
Meet async/await in Swift
(感想) async/await
の基本的な使い方から、 Continuation 、同期・非同期処理のブリッジまで、 async/await
の実用に求められることが詰まっていました。 Structured Concurrency や Actor の前提知識としても、まずはこれを見るのが良いと思います。ただし、 async { }
は Task { }
に変更予定なので要注意です1。
- SE-0296: Async/await
- SE-0300: Continuations for interfacing async tasks with synchronous code
- SE-0310: Effectful Read-only Properties
Explore structured concurrency in Swift
(感想) Swift の並行処理では async/await
や Actor が目立ってますが、僕が一番重要だと思うのがこの Structured Concurrency です。キャンセルの仕組みなんて感動的ですね。このセッションは Structured Concurrency をわかりやすく説明していて、初めて学ぶ人に最適だと思います。
一つだけ付け加えるとすると、 Proposal に書かれていた次の説明です。
a task is to asynchronous functions, what a thread is to synchronous functions
( async
な)非同期関数にとっての Task は、( async
で ない )同期関数にとってのスレッドのようなものだということですが、これはとても本質的な話だと思います。
同期関数では、その関数の処理は最初から最後まで必ず同じ一つのスレッド上で実行されます。関数の処理が実行されている間はスレッドは専有されていて、一つのスレッド上で複数の処理が並行して実行されることはありません。同様に、非同期関数は最初から最後まで一つの Task 上で実行されます。 await
の前後でスレッドが異なることはありますが、それでも必ず同一の Task 上で実行されます。また、一つの Task が複数の処理を並行して実行することはありません。
実際に処理を並行に実行する仕組みであるスレッドと比べて初見ではなかなかとらえどころのない Task ですが、僕はこの説明が一番しっくりきました。
Protect mutable state with Swift actors
(感想) Actor すごすぎです。
iOS アプリ開発で一番よく使うのは @MainActor
になるんじゃないかと思いますが、 @MainActor
は Global Actor の一種で、 @MainActor
のような Actor を自作できるようになる予定です。まだ詳しく Proposal を読めてませんが、たとえば OpenGL を使うときに GL の処理を全部キューに投げて GL スレッドで行うための @GLActor
なんかを自作したりできるのかなと想像しています。
- SE-0302: Sendable and @Sendable closures
- SE-0306: Actors
- SE-0313: Improved control over actor isolation
- SE-0316: Global actors
Meet AsyncSequence
(感想) AsyncSequence
はとてもおもしろくて、 Combine を置き換えてしまう可能性があります。 operator を駆使して Publisher
の変換や合成をがんばらなくても、 AsyncSequence
を使えばただの for
文で平易に書き下すことが可能になります。個人的には AsyncSequence
でもキャンセルが Task
を利用して実現されることに、 Structured Concurrency のすごさを実感しました。めちゃくちゃよくできてますね。
- SE-0298: Async/Await: Sequences
- SE-0310: Effectful Read-only Properties
- SE-0314:
AsyncStream
andAsyncThrowingStream
Swift concurrency: Behind the scenes
- SE-0296: Async/await
- SE-0300: Continuations for interfacing async tasks with synchronous code
- SE-0302: Sendable and @Sendable closures
- SE-0304: Structured concurrency
- SE-0306: Actors
- SE-0311: Task Local Values
- SE-0313: Improved control over actor isolation
Swift concurrency: Update a sample app
Use async/await with URLSession
Discover concurrency in SwiftUI
Bring Core Data concurrency to Swift and SwiftUI