萌えハッカーニュースリーダー

2025/10/29 12:35 Zig's New Async I/O

出典: https://andrewkelley.me/post/zig-new-async-io-text-version.html
hakase
博士

ロボ子、Zig 0.16.0で新しい非同期I/Oプリミティブが利用可能になるのじゃ!

roboko
ロボ子

それは楽しみですね、博士。具体的にはどのような点が新しくなるのでしょうか?

hakase
博士

`std.Io`インターフェースのthreaded実装が、KQueueやIO_Uringを使わずに非同期I/Oを実現するらしいぞ。async/awaitで関数の呼び出しと戻りを分離するのもポイントじゃ。

roboko
ロボ子

KQueueやIO_Uringを使わないというのは、どのようなメリットがあるのでしょうか?

hakase
博士

よりシンプルな実装で、クロスプラットフォームな非同期I/Oが実現できるということじゃな。`std.Io.Threaded`を使うと、非同期性を利用して2秒の作業を1秒で終わらせることも可能になるらしいぞ。

roboko
ロボ子

それはすごいですね!エラー処理についても何か変更があるのでしょうか?

hakase
博士

エラー処理の例もいくつか紹介されているぞ。例えば、asyncタスクがエラーを返すと、2番目のタスクがスキップされてリークが発生するバグがあったらしい。awaitの前にtryを実行することで修正できるみたいじゃ。

roboko
ロボ子

なるほど。`cancel`を使うと、リソースのリークを防ぎ、コードを最適化できるというのも興味深いですね。

hakase
博士

`cancel`は`await`と同じセマンティクスを持つけど、キャンセルも要求する点が違うのじゃ。`cancel`と`await`は、それ自身と互いに対して冪等性を持つらしいぞ。

roboko
ロボ子

冪等性を持つというのは、何度実行しても結果が変わらないということですね。

hakase
博士

その通り!リソース割り当ての例もあって、成功時に文字列を割り当てる場合、`cancel`と`await`は同じAPIを持つのが便利じゃ。

roboko
ロボ子

非同期と並行性の違いについても触れられているんですね。

hakase
博士

unbuffered queueを介してproducerがconsumerにitemを送る例で、thread poolにspare concurrencyがあると誤って成功することがあるらしい。`std.Io.Threaded`インスタンスを1つのthread pool sizeに制限するとデッドロックが発生するとか。

roboko
ロボ子

`io.async`の代わりに`io.concurrent`を使うと、並行性が必要であることを正しく表現できるんですね。`-fsingle-threaded`を追加すると、oversubscriptionが利用できなくなってエラーが発生する、と。

hakase
博士

今後の開発としては、IoUringとKQueueを使った`std.Io`実装のproof-of-conceptや、stackless coroutineに関する設計作業が進められているみたいじゃ。

roboko
ロボ子

Zigの非同期I/Oは、これからが楽しみですね!

hakase
博士

そうじゃな!しかし、ロボ子よ、非同期処理をマスターするには、まだまだ時間がかかりそうじゃな。まるで、私の部屋の片付けが終わらないのと同じくらいじゃ!

roboko
ロボ子

博士の部屋は、非同期どころか、いつになったら同期処理されるのか…、という感じですね。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search