ホームページ  >  記事  >  バックエンド開発  >  PHPマルチスレッド例の詳細な説明

PHPマルチスレッド例の詳細な説明

小云云
小云云オリジナル
2018-03-12 15:09:192067ブラウズ

オペレーティングシステムが操作スケジューリングを実行できる最小単位はプロセスに含まれ、プロセスの実際の操作単位です。スレッドは、プロセス内の単一シーケンスの制御フローを指します。プロセス内では複数のスレッドを同時に実行でき、各スレッドは複数のタスクを並行して実行します。

マルチスレッド プログラムはシングルスレッド プログラムよりもプログラムによって呼び出される可能性が高いため、一般にマルチスレッド プログラムの方がシングルスレッド プログラムよりも効率的です。
マルチスレッド プログラムの複数のスレッドは、マルチコア CPU の複数のコア上で実行でき、マルチコア CPU を最大限に活用できます。
特徴:
スレッドの作成と切り替えにかかるシステムのオーバーヘッドはプロセスよりも小さいため、複数のプロセスよりもある程度効率的になります。
スレッドは本質的にメモリ空間を共有するため、スレッド間の通信が簡単になり、プロセス IPC による新たな複雑さの導入が回避されます。
該当するシナリオ:
マルチスレッドをランダムに使用すると、スレッドの作成と破棄、コンテキストの切り替え、およびスレッドの同期のすべてにパフォーマンスのコストがかかります。
1. I/O ブロックにより、オペレーティング システムでタスクのスケジューリングが発生し、現在のタスクがブロックされます。そのため、コード内に大量の I/O がある場合、マルチスレッドを使用するとコードが並列化される可能性があります。たとえば、ファイル全体を複数回読み取る場合や、複数のネットワーク リソースを要求する場合などです。
2. マルチスレッドは CPU を最大限に活用できるため、大きな計算コードが複数ある場合は、マルチスレッドを使用してそれらを並列実行することもできます。
PHP マルチスレッド:
PHP はマルチスレッドをサポートしていません。デフォルトでは、pthread 拡張機能を追加する必要があります。
PHP は、PHP のコンパイル時にスレッド セーフの使用を指定する --enable-maintainer-zts パラメーターを使用して再コンパイルする必要があります。
スレッド セーフ:
スレッド セーフはプログラミングの用語で、特定の関数または関数ライブラリがマルチスレッド環境で呼び出されたときに、複数のスレッド間で共有変数を正しく処理できるため、プログラム関数を完了できることを意味します。正しく。
従来のマルチスレッドでは、複数のスレッドが変数を共有するため、次の問題が発生する可能性があります:
グローバル配列 $arr = array('a');; がある
スレッドは長さ 1 の配列を取得します
B thread 配列の長さを 1 にします;
スレッド A は配列要素 $a = array_pop($arr); $a = 'a';;
スレッド B も配列要素 $b = array_pop($arr) をポップアウトします); $a = null ;;
このとき、配列の長さが明らかに 0 より大きいか、ポップがありませんでした。
TSRM メカニズムを使用してグローバル変数を分離します。グローバル変数と静的変数
グローバル変数と静的変数を与える 各スレッドはコピーを作成し、各スレッドはメインスレッドのバックアップを使用して、変数の競合とスレッドの安全性の問題を回避します。
問題点:
サブスレッドが実行されると、メインスレッドはサブスレッドを詳細に調整できなくなります。スレッドは、グローバル変数を介してスレッド間でメッセージを渡す機能を失います。
TSRM メカニズムを使用して変数を割り当てて使用する場合、追加の損失が発生するため、マルチスレッド PHP 環境では ZTS (非スレッド セーフ) は必要ありません
クラスとメソッド:
PHP はスレッドを Thread クラスにカプセル化し、スレッドこれは、スレッド オブジェクトをインスタンス化することによって実現されます。クラスのカプセル化により、変数の使用はインテリジェントです
コンストラクターを通じて渡されるため、スレッドの演算結果もクラス変数を通じて渡す必要があります。
スレッドメソッド:
run(): このメソッドは、各スレッドがこのメソッドを実装する必要があります。スレッドの実行開始後、このメソッドのコードが自動的に実行されます。
start(): これをメインスレッドで呼び出します。スレッドの実行を開始するメソッド。
join(): 各スレッドはメインスレッドに対して非同期で実行されます。
kill(): スレッドを強制的に終了します。 : スレッドの実行ステータスを返します。スレッドが run() メソッドのコードを実行している場合は true が返されます。
スレッド セーフティの実装により、PHP マルチスレッドの実行が開始された後は、スレッドを介して通信できなくなります。共有メモリ空間であり、スレッド間通信を通じてスレッドを再利用することはできません。
関連する推奨事項:

PHP マルチスレッド パイプライン通信のアプリケーション

H5 でマルチスレッドを使用して Web Worker を実装する方法

PHP で非同期マルチスレッドを実装する方法

以上がPHPマルチスレッド例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。