Concurrency
Asynchronous code(非同期なコード)は途中で実行が止められたり,後で再開されたりするが,一度に実行されるコードは一つだけである.Parallel code(並列なコード)は同時に複数のコードが実行される.Concurrencyの章ではこれらのコードの組み合わせをconcurrencyと呼ぶ. Swiftはconcurrentなコードを書ける機能を言語レベルでサポートしている.
ということで今日からConcurrencyの章に入っていく.この前のWWDCでの目玉の一つなので楽しみ.
Asynchronousな関数
引数のリストの後,throws
の前にasync
と書くとその関数がasynchronousであると示せる.その関数を呼ぶときはasync
をつける.
めんどくさいのでこれ以降はasynchronousな-はasyncな-と書く.
synchronous vs asynchronous
呼んだ関数がasyncであろうとなかろうと,結局その関数の実行が終わるまで次の行は実行されない.ただ,asyncな関数の場合はその関数内の処理がsuspendされたときに他の(この章でいう)concurrentなコードが実行される.このとき,Swiftがasyncな関数を呼んだスレッドをsuspendして別のスレッドにあるコードを実行することから,yielding the thread
とも呼ばれるらしい.
let result = await asyncFunc() print(result)
let result = nonAsyncFunc() print(result)
asyncな関数を呼べる箇所は以下の3つに限られる
- asyncな関数,メソッド,プロパティ
@main
がついたstructure, class, enumerationのstatic main()
- detached child task
そういえばXcode 12.xなので書けない…??