WWDC 2021のSwiftの並行処理関連のセッション一覧

[WWDC 2021](https://developer.apple.com/wwdc21/) が始まりました。 **今年は Swift 5.5 で並行処理の大型アップデートが予定** されており、長年待ち望まれていた `async/await` に加えて、さらに先進的な Structured Concurrency や Actor なども導入されます。そのため、 WWDC 2021 では並行処理関連のセッションが多数予定されています。

そこで、[セッション一覧](https://developer.apple.com/wwdc21/sessions/)から並行処理関連のものを探して一覧にしてみました。内容はまだわかりませんが、個人的に重要度が高そうだと思う順に並べてみました。各セッション下部のリンクは内容に関係しそうな Proposal です。 **（感想）** は実際にそのセッションを見た感想です。

もし抜け漏れなどあればコメント下さい🙇

## What‘s new in Swift

これは並行処理についてのセッションではないですが、 Swift 5.5 での新機能の大きな割合を並行処理関連のものが占めているので、最初にこれを見ることで全体を見渡すことができると思います。

**（感想）** Swift Evolution の Proposal のまとめだけでなく、 Swift 関連のニュース（たとえば Swift Collections や Swift Algorithms のようなライブラリ）の網羅的なダイジェストになっていてとても良かったです。各項目の詳細は他のセッションに橋渡しされており、並行処理関連でも本記事で次に挙げている三つのセッションが紹介されていました。まずはこれを見て全体像を掴むと良いと思います。

https://developer.apple.com/videos/play/wwdc2021/10192/

- [SE-0296: Async/await](https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md)
- [SE-0304: Structured concurrency](https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md)
- [SE-0306: Actors](https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md)
- [SE-0317: `async let` bindings](https://github.com/apple/swift-evolution/blob/main/proposals/0317-async-let.md)

## Meet async/await in Swift

**（感想）** `async/await` の基本的な使い方から、 Continuation 、同期・非同期処理のブリッジまで、 `async/await` の実用に求められることが詰まっていました。 Structured Concurrency や Actor の前提知識としても、まずはこれを見るのが良いと思います。ただし、 `async { }` は `Task { }` に変更予定なので要注意です[^1]。

https://developer.apple.com/videos/play/wwdc2021/10132/

- [SE-0296: Async/await](https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md)
- [SE-0300: Continuations for interfacing async tasks with synchronous code](https://github.com/apple/swift-evolution/blob/main/proposals/0300-continuation.md)
- [SE-0310: Effectful Read-only Properties](https://github.com/apple/swift-evolution/blob/main/proposals/0310-effectful-readonly-properties.md)

## Explore structured concurrency in Swift

**（感想）** Swift の並行処理では `async/await` や Actor が目立ってますが、僕が一番重要だと思うのがこの Structured Concurrency です。キャンセルの仕組みなんて感動的ですね。このセッションは Structured Concurrency をわかりやすく説明していて、初めて学ぶ人に最適だと思います。

一つだけ付け加えるとすると、 [Proposal に書かれていた次の説明](https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md#tasks)です。

> a task is to asynchronous functions, what a thread is to synchronous functions

（ `async` な）非同期関数にとっての Task は、（ `async` で **ない** ）同期関数にとってのスレッドのようなものだということですが、これはとても本質的な話だと思います。

同期関数では、その関数の処理は最初から最後まで必ず同じ一つのスレッド上で実行されます。関数の処理が実行されている間はスレッドは専有されていて、一つのスレッド上で複数の処理が並行して実行されることはありません。同様に、非同期関数は最初から最後まで一つの Task 上で実行されます。 `await` の前後でスレッドが異なることはありますが、それでも必ず同一の Task 上で実行されます。また、一つの Task が複数の処理を並行して実行することはありません。

実際に処理を並行に実行する仕組みであるスレッドと比べて初見ではなかなかとらえどころのない Task ですが、僕はこの説明が一番しっくりきました。

https://developer.apple.com/videos/play/wwdc2021/10134

- [SE-0304: Structured concurrency](https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md)
- [SE-0311: Task Local Values](https://github.com/apple/swift-evolution/blob/main/proposals/0311-task-locals.md)
- [SE-0317: `async let` bindings](https://github.com/apple/swift-evolution/blob/main/proposals/0317-async-let.md)

## Protect mutable state with Swift actors

**（感想）** Actor すごすぎです。

https://twitter.com/koher/status/1404248198978306051?s=20

iOS アプリ開発で一番よく使うのは `@MainActor` になるんじゃないかと思いますが、 `@MainActor` は [Global Actor](https://github.com/apple/swift-evolution/blob/main/proposals/0316-global-actors.md) の一種で、 `@MainActor` のような Actor を自作できるようになる予定です。まだ詳しく Proposal を読めてませんが、たとえば OpenGL を使うときに GL の処理を全部キューに投げて GL スレッドで行うための `@GLActor` なんかを自作したりできるのかなと想像しています。

https://developer.apple.com/videos/play/wwdc2021/10133

- [SE-0302: Sendable and @Sendable closures](https://github.com/apple/swift-evolution/blob/main/proposals/0302-concurrent-value-and-concurrent-closures.md)
- [SE-0306: Actors](https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md)
- [SE-0313: Improved control over actor isolation](https://github.com/apple/swift-evolution/blob/main/proposals/0313-actor-isolation-control.md)
- [SE-0316: Global actors](https://github.com/apple/swift-evolution/blob/main/proposals/0316-global-actors.md)

## Meet AsyncSequence

**（感想）** `AsyncSequence` はとてもおもしろくて、 Combine を置き換えてしまう可能性があります。 operator を駆使して `Publisher` の変換や合成をがんばらなくても、 `AsyncSequence` を使えばただの `for` 文で平易に書き下すことが可能になります。個人的には `AsyncSequence` でもキャンセルが `Task` を利用して実現されることに、 Structured Concurrency のすごさを実感しました。めちゃくちゃよくできてますね。

https://developer.apple.com/videos/play/wwdc2021/10058

- [SE-0298: Async/Await: Sequences](https://github.com/apple/swift-evolution/blob/main/proposals/0298-asyncsequence.md)
- [SE-0310: Effectful Read-only Properties](https://github.com/apple/swift-evolution/blob/main/proposals/0310-effectful-readonly-properties.md)
- [SE-0314: `AsyncStream` and `AsyncThrowingStream`](https://github.com/apple/swift-evolution/blob/main/proposals/0314-async-stream.md)

## Swift concurrency: Behind the scenes

https://developer.apple.com/videos/play/wwdc2021/10254

- [SE-0296: Async/await](https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md)
- [SE-0300: Continuations for interfacing async tasks with synchronous code](https://github.com/apple/swift-evolution/blob/main/proposals/0300-continuation.md)
- [SE-0302: Sendable and @Sendable closures](https://github.com/apple/swift-evolution/blob/main/proposals/0302-concurrent-value-and-concurrent-closures.md)
- [SE-0304: Structured concurrency](https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md)
- [SE-0306: Actors](https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md)
- [SE-0311: Task Local Values](https://github.com/apple/swift-evolution/blob/main/proposals/0311-task-locals.md)
- [SE-0313: Improved control over actor isolation](https://github.com/apple/swift-evolution/blob/main/proposals/0313-actor-isolation-control.md)

## Swift concurrency: Update a sample app

https://developer.apple.com/videos/play/wwdc2021/10194

## Use async/await with URLSession

https://developer.apple.com/videos/play/wwdc2021/10095

## Discover concurrency in SwiftUI

https://developer.apple.com/videos/play/wwdc2021/10019

## Bring Core Data concurrency to Swift and SwiftUI

https://developer.apple.com/videos/play/wwdc2021/10017

[^1]: https://forums.swift.org/t/swift-concurrency-feedback-wanted/49336, https://discord.com/channels/291054398077927425/291054454793306112/851983218789318658 （ @shiz さん、情報ありがとうございました）