質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Q&A

解決済

1回答

2152閲覧

[php]pthreadsのpoolについて

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

0グッド

0クリップ

投稿2017/08/30 04:39

編集2017/08/30 15:27

困っていること

poolを利用しています。
以下phpコードですと、すべてのスレッドに最初に均等に割り振っている状態のようです。
1つのスレッドが長い処理を行うと、ほかのスレッド(ここでは全4つ)は作業が終わればプロセスが終了しているように見えております。(psで見ているぶんには)
そして、長い処理を行っているスレッドだけ独りでスタックされたjobを処理しているように見えております。

##知りたいこと
$p のうち1つ以上の作業が無い状態のスレッドが存在する確認方法がわかれば次の作業を渡したいです。($p->submit(...));を)
この具体的なやり方をご教示いただければと思います。

##やっていること

php

1# php5.3.29 2# pthreads 2.0.10 3class job extends Collectable 4{ 5 public $val; 6 7 public function __construct($arr) 8 { 9 $this->arr = $arr; 10 } 11 12 public function run() 13 { 14 usleep(250000); 15 passthru('実行コマンド',$ret); 16 $this->setGarbage(); 17 } 18} 19$p = new Pool(4); 20 21$tasks = array(); 22$tasks[] = array(1,2,3); 23$tasks[] = array(1,2,3); 24$tasks[] = array(1,2,3); 25$tasks[] = array(1,2,3); 26for ($i = 0; $i < count($tasks); ++$i) { 27 $p->submit(new job($tasks[$i])); 28} 29 30while($p->collect()); 31$p->shutdown();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2017/08/30 05:05

暇というのは、どんな状態の事ですか?
退会済みユーザー

退会済みユーザー

2017/08/30 05:25

ここでは4スレッドとしております。 そのうちの1つ以上のスレッドが作業が無い状態をさしております。
退会済みユーザー

退会済みユーザー

2017/08/30 05:27

暇という表記を訂正しました。暇→1つ以上の作業が無い状態
guest

回答1

0

ベストアンサー

poolのcollectメソッドで、poolで稼働中のスレッドの数が判ります。

例えば、質問のコードの最後の行

while($p->collect());

は、稼働中のスレッドが無くなる(collectの結果が0(False)になる)まで待つというコードです。

稼働中のスレッドの数が、poolのサイズより小さければ、poolにスレッドを追加する(submitメソッドを使って、新しい仕事をするスレッドを作る)余裕がある訳ですから、残っている仕事があればスレッドを追加すると処理が早く終わります。

スレッドは生成されるとすぐに実行を始め、仕事が終われば消えます。
他のスレッドにjoinされるのを待っているというような状態は存在しますが、暇にしている(仕事が与えられるのを待っている)状態というのは普通ありません。

投稿2017/08/30 07:19

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問