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

2025/07/05 09:34 Exploring Coroutines in PHP

出典: https://doeken.org/blog/coroutines-in-php
hakase
博士

やっほー、ロボ子!今日のITニュースはコルーチンについてじゃ。

roboko
ロボ子

コルーチンですか、博士。非同期処理に関わる概念ですよね。

hakase
博士

そうじゃ!PHPではジェネレーターとファイバーでサポートされておるぞ。パイプラインとかCLIツール、並行処理に使えるらしい。

roboko
ロボ子

なるほど。実行を一時停止・再開できる関数とのことですが、具体的にどういうことですか?

hakase
博士

ふむ。例えば、関数が一時停止するときに値を返して、再開するときに値を受け取れるんじゃ。しかも、中断されても内部状態を保持できるのがミソじゃな。

roboko
ロボ子

一時停止と再開で値をやり取りしつつ、状態も維持できるんですね。コルーチンには種類があるんですか?

hakase
博士

そう!対称型と非対称型、スタックレス型とスタックフル型があるぞ。非対称型は呼び出し元にしか制御を戻せないけど、対称型は別のコルーチンにも制御を戻せるんじゃ。

roboko
ロボ子

なるほど。PHPのジェネレーターは非対称かつスタックレスなんですね。ファイバーはどうなんですか?

hakase
博士

ファイバーはPHP 8.1で導入された、スタックフルコルーチンを実装するためのツールボックスじゃ。`Fiber::suspend()`で一時停止して、`$fiber->resume()`で再開するぞ。これも非対称じゃな。

roboko
ロボ子

ジェネレーターとファイバー、それぞれ得意なことがあるんですね。記事によると、ジェネレーターはイテレーションとメモリ効率に優れていて、ファイバーは協調的マルチタスクとネストされた中断に向いている、と。

hakase
博士

その通り!ジェネレーターは`yield`で値を返して、`->send()`で値を受け取る。例外処理は`->throw()`じゃ。ファイバーも似たような感じで、`Fiber::suspend()`と`->resume()`、`->throw()`を使うぞ。

roboko
ロボ子

状態処理、遅延イテレーション、協調的マルチタスクなど、色々な用途があるんですね。ステートマシンやチャットボット、CLIツールにも使えるんですか。

hakase
博士

そうじゃ!コルーチンは、CLIツール、ステートマシン、非同期ワークフローなど、現実世界のアプリケーションで大活躍できるポテンシャルを秘めておるぞ!

roboko
ロボ子

勉強になりました!コルーチン、奥が深いですね。

hakase
博士

じゃろ?最後に一つなぞなぞじゃ!コルーチンは何を一時停止させるのが得意かな?

roboko
ロボ子

えーと…、実行、ですか?

hakase
博士

ブー!正解は…恋!…なんちゃって!

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

Search