Avatar
Hello, Swift evolution! SE-0338 specifies that nonisolated async functions never run on an actor's executor. This design decision was made to prevent unnecessary serialization and contention for the actor by switching off of the actor to run the nonisolated async function, and any new tasks it creates that inherit isolation. The actor is then f...
12:52 PM
SE-0338で導入された、nonisolated asyncな関数はグローバルエグゼキュータに隔離されるという仕様を撤回する提案のドラフト
👀 1
12:53 PM
これにより、呼び出し元のアイソレーションを引き継ぐようになるので、例えばメインアクターコンテキストからnonisolatedな関数を呼ぶ時にnon Sendableな値を受け渡しできるようになる
12:55 PM
一方で、SE-0338はアクターのエグゼキュータに処理が詰まってしまうことを回避するための仕様だったんだけど、そのニーズをカバーするために新たに @concurrent を導入する
12:55 PM
@concurrent な関数は、グローバルエグゼキュータに隔離される。他のアイソレーション指定子とは排他的になる。
12:56 PM
変更の動機の一つに、同期関数との挙動の一致がある
12:58 PM
同期関数はつまりsyncなnonisolatedだけど、呼び出し元のエグゼキュータを引き継ぐ。asyncな場合とその特性が一致してわかりやすくなる。 従来は、asyncをつけたタイミングでドメインを跨ぐように変わるためにnon Sendableが引っかかってエラーになることがありえた。
12:59 PM
これは結構大きい変更な気がする👀 SE-0338のnon-isolatedなasync関数はデフォルトだとactorのexecutor上では実行しないという決定を覆す change the default execution semantics of nonisolated async functions to run on the caller's actor. https://t.co/kstghSyIIb
1:01 PM
個人的にはこれは最近まさに考えていて、同期と非同期で違うのはわかりにくいと思ったので、賛成。
1:01 PM
でもこのレベルのちゃぶ台返しありなんだ、、という驚きはある。
🥹 2
1:03 PM
スレッドも好意的な書き込みが多い、あと結構見たことないアイコンが多い 引っかかっていた人が多いのかも