web-dev-qa-db-ja.com

PHP:pthreadを使用するタイミング

スレッドの使用についてはあまり知りませんが、phpのpthreadを調べたところ、非常に興味深く、簡単、または思ったより簡単に見えました...

私は例を検索してドキュメントを調べましたが、スレッドを使用することが実際に有益である場合の実際の例は見つかりませんでした。それは、多くのhttpリクエストを実行するなど、相互に依存しない長いタスクのためです。多分メールを送る。

しかし、ログエントリの書き込みはどうですか?データベースへの挿入? (ユーザーアクティビティの追跡など)データベースからのフェッチ(スレッドからデータを返すことはできますか?)

これによりパフォーマンスが向上しますか、それともスレッドを作成するオーバーヘッドが多すぎますか? (ワーカープールを使用することでオーバーヘッドを減らすこともできますが...)

アドバイスや例は大歓迎です!

26
joschua011

ディストリビューションには多くのサンプルが含まれており、githubで入手できます。

https://github.com/krakjoe/pthreads/tree/master/examples

これらの例には、汎用スレッドプール、マルチスレッドソケットサーバー、SQLWorkerなどが含まれます。

Pthreadが作成するスレッドは、Zend自体がマルチスレッドのSAPIを介してサービス要求に設定するスレッドと同じくらい、正気で安全です。それらはすべて同じ機能と互換性があり、それに加えて(ほぼ)高レベルのスレッド化APIに期待されるすべての機能を備えています。

シェアード・ナッシング・アーキテクチャーの奥深くでスレッドを実装することには常に制限がありますが、自由に使用できる物理リソースをより適切に使用するという利点だけでなく、PHP特定のタスクについては、その環境を回避するオーバーヘッドをはるかに上回ります。

Pthreadに含まれるオブジェクトは、他のすべてのPHPオブジェクトと同じように機能し、オブジェクトへの参照を使用して任意のコンテキストからそれらのメソッドを読み取り、書き込み、実行できます。

あなたは正しい線に沿って正確に考えています。効率の尺度は、アプリケーションが実行するスレッドの数ではなく、アプリケーションの主要な目的に最もよく応えるためにそれらのスレッドがどのように利用されるかです。ワーカーは、どこでも使用できるようにすることをお勧めします。

あなたが尋ねた特定の事柄に関して、LoggingWorkerは良いアイデアであり、機能します。意味がないのでそのストリームを共有しようとしないでください。Workerがログファイルまたはデータベース接続を開いた場合、それは完全に安定します。それによって実行されるスタッカブルはそれらにアクセスできます。 SQLWorkerはサンプルに含まれていますが、これもAPIが適切な非同期APIを欠いている場合や、マルチスレッドプログラミングのフローを好む場合に適しています。

あなたはより良い、またはより正しい答えを得ることはできません:私は自分でpthreadを書きました。

93
Joe Watkins