Avatar
Avatar
omochimetaru
なるほど。3まではOKで、4は別に決めの問題で、旧inheritActorContextやinheritsIsolationはあくまで静的に見えるシグネチャとしての場合での引き継ぎだと捉えれば、暗黙のisolatedを引き継がないのは特に問題が無いと思います。ただまあ引き継ぐ方に直すのでもフィールとして一貫性は取れるとは思います。
おそらくactorの外から呼ばれた時は nil になる
これは関係なくないですか? この提案の元でもnonisolated funcの中でTask.initした場合、呼び出し元がnil actorの場合にはどうせ直列化できないから、いずれにしても静的には並行だとして実装する必要がある。 つまり、inheritActorContextはもともとから、「いつでも直列にできる」ものではないですよね。静的にactor isolateサれている場合だけ直列になるものだった。 それとも、いつでも直列にできるものになったらいいな、という事?
Task-isolated な場合もcontext(というかisolation domain)を引き継ぐようにして
これって、actor isolatedではない普通の状況で、Task.init したらそこから並列な実行フローが生える、という一番素朴な仕様を捨ててしまうので変だと思います。
常にいずれかのisolation domainに属することを保証して
スレッドをSwift Runtimeの外で立ち上げてそこから呼び出されてくるパターンが残るので根本的に不可能に思います。
(edited)
それとも、いつでも直列にできるものになったらいいな、という事?
はい、そうです。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 に入ることができないといけないけど・・・