php のスレッドとコルーチンの理解
1. スレッド
スレッドは軽量プロセスとも呼ばれます。 CPUの基本的な実行単位であり、プログラム実行プロセスの最小単位であり、スレッドID、プログラムカウンタ、レジスタセット、スタックで構成されます。スレッドの導入により、プログラムの同時実行のオーバーヘッドが削減され、オペレーティング システムの同時実行パフォーマンスが向上します。スレッドには独自のシステム リソースがありません。
プロセスに対するスレッドの利点は、スレッドが高速であることです。新しいスレッドの作成やスレッドの終了、スレッド間の切り替え、スレッド間のデータや通信の共有など、スレッドの速度はそれよりも高速です。大きな利点。
スレッドの出現は、コンテキスト切り替えの消費を削減し、システムの同時実行性を向上させ、1 つのプロセスが 1 つのことしか実行できないという欠点を克服し、プロセス内の同時実行を可能にすることを目的としています。
2. Coroutine
Coroutine はユーザー モード スレッドです。「ユーザー モード スレッド」とは何かを理解するには、まず「ユーザー モード スレッド」とは何かを理解する必要があります。 「カーネル状態スレッド」。カーネル状態スレッドはオペレーティング システムによってスケジュールされます。スレッド コンテキストを切り替えるときは、まず前のスレッドのコンテキストを保存してから、次のスレッドを実行する必要があります。条件が満たされたら、前のスレッドに切り替えてコンテキストを復元します。コルーチンにも同じことが当てはまりますが、ユーザー モード スレッドはオペレーティング システムではなくプログラマによってユーザー モードでスケジュールされる点が異なります。
yield
このキーワードは、割り込みを生成し、現在のコンテキストを保存するために使用されます。たとえば、プログラム内のコードがリモート サーバーにアクセスする場合、この時点では CPU はアイドル状態になります。時間がかかるため、Yield を使用して CPU を放棄し、次のコードを実行します。次のコードがまだ CPU 以外のリソースにアクセスする場合は、yield を呼び出して CPU を放棄することもできます。実行を継続します。同期的な方法で非同期コードを作成できます。
①コルーチンの登場
コルーチンの登場以前は、マルチタスクの並行性を実現する必要があり、OS(オペレーティングシステム)のない時代には、ステート マシンを使用してマルチタスクを実装できます。単一プロセス環境で複数のタスクを逆アセンブルして実行しますが、このモードでは開発者が各タスクを明確に理解している必要があり、開発者はタスク関連の関数 (タスクなど) も開発する必要があります。タスク間の通信として)それ自体で。
その後、OS(オペレーティングシステム)が登場し、OSが提供するプロセスやスレッドの機能を利用することで、簡単にマルチタスクを実現できるようになりました。 OS では、プロセス コンテキストの切り替えは OS カーネルによって制御されます。しかし、プロセス コンテキストの頻繁な切り替えにより、OS のパフォーマンスが低下する (主に消費量の少ないタスク プロセスの短期間の実行) という問題が発生しました。
この問題を解決するために、複数のタスクを同じプロセスまたはスレッドで実行するという新しい概念が提案され始めましたが、これはOSの初期のマルチタスク実装に戻ることに相当します。 -自由な時代。そして現在、その解決策はコルーチンと呼ばれています。その本質は、タスクスイッチングの一部をカーネルからアプリケーション層に転送することです。
②PHP におけるコルーチンの基本的なツールと基本的な使用法
コルーチンを実装するために、PHP はジェネレーターと yield キーワードという 2 つの新しい機能を提供します。
(1)ジェネレーターとは何ですか?
ジェネレーターはイテレータを継承して実装します。これは PHP コードの関数定義に似ていますが、次のような yield キーワードを内部で使用します。 # 使用すると、次のようになります:
わかりました、このように使用するとはどういう意味ですか?
(1) まず、$my_gen = gen(); このコードは新しいジェネレーターをインスタンス化するだけで、内部のコードは実行されません;(2) $my_gen->current(); コードは yield " を実行します。ジェネレーターのステップ 2 で「gen1」を作成します。この時点で、コードは中断され、文字列「gen1」がジェネレーター $my_gen に渡され、current() 関数の戻り値として使用されます。ここで current() メソッドを使用し続けても、結果は変わりません $my_gen の戻り値は gen1 のままです (3) send("main send") が実行されると、文字列 "main send" " is ジェネレーター $my_gen が渡され、ステップ 2 の yield の戻り値としてジェネレーターが ret に渡されます。send() メソッドを介して、前のコンテキストが検索され、下に進みます。
(4) ジェネレーター step3 の実行後、step4 に遭遇すると、yield に遭遇すると再び中断されます。
上記の内容は参考用です。
推奨チュートリアル:
PHP ビデオ チュートリアル
以上がPHPスレッドコルーチンを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。