0

php で multi_threading プログラムを実装しようとしています。pthread パッケージをダウンロードし、必要な構成をすべて行いました。そして、私はこのコードを実行しようとしました:

<?php 
class AsyncOperation extends Thread {

public function __construct($arg) {
    $this->arg = $arg;
}

public function run() {
    if ($this->arg) {
        $sleep = mt_rand(1, 10);
        printf('%s: %s  -start -sleeps %d' . "\n", date("g:i:sa"), $this->arg, $sleep);
        sleep($sleep);
        printf('%s: %s  -finish' . "\n", date("g:i:sa"), $this->arg);
    }
}
}

// Create a array
$stack = array();

//Iniciate Miltiple Thread
foreach ( range("A", "D") as $i ) {
    $stack[] = new AsyncOperation($i);
}

// Start The Threads
foreach ( $stack as $t ) {
    $t->start();
}

?>

しかし、コードを実行するたびに、次のような結果が得られます。

4:29:47pm: A -start -sleeps 1 
4:29:48pm: A -finish 
4:29:47pm: C -start -sleeps 3 
4:29:50pm: C -finish 
4:29:47pm: D -start -sleeps 4 
4:29:51pm: D -finish 
4:29:47pm: B -start -sleeps 7 
4:29:54pm: B -finish

別の実行:

5:29:21pm: A -start -sleeps 1 
5:29:22pm: A -finish 
5:29:21pm: B -start -sleeps 3 
5:29:24pm: B -finish 
5:29:21pm: D -start -sleeps 8 
5:29:29pm: D -finish 
5:29:21pm: C -start -sleeps 9 5:29:30pm: C -finish

ご覧のとおり、スレッドが同時に動作していないように見えるという問題は、スレッドが開始されるたびに、終了する前に他のスレッドが開始されません。私が気づいた興味深いことは、スレッドが常に最小のスリープ時間から始まるということです!

私は次のような実行を期待しています:

12:00:06pm:     A  -start -sleeps 5
12:00:06pm:     B  -start -sleeps 3
12:00:06pm:     C  -start -sleeps 10
12:00:06pm:     D  -start -sleeps 2
12:00:08pm:     D  -finish
12:00:09pm:     B  -finish
12:00:11pm:     A  -finish
12:00:16pm:     C  -finish

どうすれば希望の実行を取得できるか教えてもらえますか? 私はphp5を使用しています。注:このウェブサイトの他の投稿からコードを取得しました: 確認してください

よろしくお願いします。

4

2 に答える 2

1

うーん... タイムスタンプを見ると、すべてが同時に開始されたようです (4:29:47pm):

4:29:47pm: A -start -sleeps 1 
4:29:48pm: A -finish 
4:29:47pm: C -start -sleeps 3 
4:29:50pm: C -finish 
4:29:47pm: D -start -sleeps 4 
4:29:51pm: D -finish 
4:29:47pm: B -start -sleeps 7 
4:29:54pm: B -finish

これと同じ (5:29:21pm):

5:29:21pm: A -start -sleeps 1 
5:29:22pm: A -finish 
5:29:21pm: B -start -sleeps 3 
5:29:24pm: B -finish 
5:29:21pm: D -start -sleeps 8 
5:29:29pm: D -finish 
5:29:21pm: C -start -sleeps 9
5:29:30pm: C -finish

何か不足していますか?

ただし、寝る前に印刷しないことがわかります。

于 2013-10-25T15:42:29.737 に答える