Open6

Swift 5.5からの非同期処理について

yimajoyimajo

はじめに

このスクラップではWWDC21で発表された新しい非同期処理についてスクラップしておきます。

注意として、WWDCで発表される内容はベータでありバージョンが進むたびにガンガン変わります。ここに書いてあることは読んでいるときには全然違うことになってるってことがあるのです。そして公開情報だけを書いていくつもりです。

yimajoyimajo

新しい非同期処理の説明の前に

WWDC21のPlatforms State of the Union (以下PSoU). よかったですね。

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

そもそもオンラインイベント2年目になったことで、技術的な説明にかなりフォーカスしてる感じがします。オフラインの時のように、Keynote.appで静的なスライドでアニメーションさせるのではなく、説明のアニメーションがかなり作り込まれている気がします。さらにデモンストレーションなどもスムーズです。ライブの緊張もないでしょうからね。

閑話休題。

PSoUでSwiftの非同期処理についに(コルーチンベースの)async/awaitが追加されたことが最も大きな話題でしょう。なぜコルーチンベースの、という注釈を置いたかというとそれはスレッドベースのasync/await的なことの実現ならばそれは今まででもやろうとすれば可能だったわけです。

スレッドベースのasync/awaitって何?

スレッドベースのasync/awaitって何よ?という方にざっくり説明すると、次の二つのライブラリでそれができます。

https://github.com/malcommac/Hydra

https://github.com/google/promises

これらは基本的には同じで、セマフォによってスレッドを停止し再開する手法をとっています。特徴として、HydraがSwift実装だったのを、あとからGoogleがObjective-C実装で真似したような感じだと思います。このような実装はライブラリでテストが書かれているからそこそこ安全ですが、基本的にテストコードを書かない流派または己にテストを書かないことで肉体を強化する縛りを課している方は真似してはいけません。簡単にスレッドが停止したままになったりします。基本はセーフティーじゃないんです。

WWDC21のハッシュタグを追ってると 「いままでSwiftにasync/awaitなかったの?」 という疑問をもったツイートを見かけました。その疑問はもっともですよね、その簡単な答えとして、「言語レベルでコルーチンベースのasync/awaitはありませんでした。しかし代替手段がいろいろありました」ということになります。他にはRxというやばい手段に手を染めるものもいました...。というのは冗談でリアクティブプログラミングのためのRxにはRx的な用途が別にありますし、Combineにもそれなりの用途があります。データの監視やらイテレーティブにデータを扱うこと、そしてRxやCombineは関数型プログラミングを知らんとひどいことになるぞということを教えてくれる先生なわけです。

yimajoyimajo

新しい非同期処理について

技術的要素とテーマ

技術的要素は次の3つです

  • async/await
  • Structured concurrency
  • Actors

https://twitter.com/yimajo/status/1402026427457818624

これらの要素が実現するのは次のテーマのようです

  • modern
  • safe
  • fast

モダンで安全で早い。この3つを兼ね備えた平行処理を実現するためにSwiftのasync/awaitは待つ必要があったんや!そういうことで納得しましょう。