Avatar
Avatar
koher
それとも、いつでも直列にできるものになったらいいな、という事?
はい、そうです。Swiftのコードはすべて何らかのisolation domainに所属した状態で実行されているようになれば、それが実現可能だろうと考えています。現状ではそうなっていないから Optional になってるんだろうと。 で、そうだとすると、
これって、actor isolatedではない普通の状況で、Task.init したらそこから並列な実行フローが生える、という一番素朴な仕様を捨ててしまうので変だと思います。
は、actor isolatedでなくてもisolation domainを引き継ぐ&常にisoladion domainに属するなら問題ないはず。現に @main でも MainActor-isolatedだし。 nonisolated func は呼び出し元のisolation domainを引き継ぎ、常にisolation domainに属しているなら可能なはず。
スレッドをSwift Runtimeの外で立ち上げてそこから呼び出されてくるパターンが残るので根本的に不可能に思います。
これは、Swiftに再突入した時点で Task に入れられないかなぁ。同期的に Task に入ることができないといけないけど・・・
omochimetaru 9/25/2024 1:29 PM
nonisolated func は呼び出し元のisolation domainを引き継ぎ、常にisolation domainに属しているなら可能
原理的にそのように動かすことはできても、バックグラウンド処理化するという意味での並列性が消えて、呼び出し元のdomain(executor)が混線してしまいますよね。cooperativeな並行性は残せるけど。
Swiftに再突入した時点で Task に入れられないかなぁ。同期的に Task に入ることができないといけない
これってよくある、「同期のonButtonTapコールバックの中からTaskに入ってasync処理をしたい」って思うけどどうしてもできないのと同じで、絶対できない事に思います。 そうやって入った先でさらにTask.initしてisolation domainを継承したりできるためには、そのフローでsuspendしたりresumeできるということで、そのスレッドがマネージドなexecutorで実行されるコルーチンフロー(要はTask)でないといけないので、呼び出し元を抑えられてる状況からだとどうにもならない。
(edited)
1:31 PM
後からモナドにできない、エフェクトを内側から追加できないのと一緒で。non throwsな関数から呼び出された先から例外を投げたいとかと同じ無理難題になってるような感じがします。