我采用了pthread PHP7扩展的最基本演示,它使用了Pool
类(此演示https://github.com/krakjoe/pthreads#polyfill),并对其进行了一些扩展,以便可以从线程中获取结果(或者至少我认为我可以):在PHP7中使用Pool类pthreads扩展
$pool = new Pool(4);
foreach (range(1, 8) as $i) {
$pool->submit(new class($i) extends Threaded
{
public $i;
private $garbage = false;
public function __construct($i)
{
$this->i = $i;
}
public function run()
{
echo "Hello World\n";
$this->result = $this->i * 2;
$this->garbage = true;
}
public function isGarbage() : bool
{
return $this->garbage;
}
});
}
while ($pool->collect(function(Collectable $task) {
if ($task->isGarbage()) {
echo $task->i . ' ' . $task->result . "\n";
}
return $task->isGarbage();
})) continue;
$pool->shutdown();
什么是困惑我的是,它有时不能得到结果所有任务:
Hello World
Hello World
Hello World
Hello World
Hello World
1 2
2 4
Hello World
Hello World
3 6
Hello World
7 14
4 8
8 16
现在两行5 10
和6 12
失踪,但我不明白为什么。这种情况有时只会发生(可能是1/10次)。
它看起来像原来的演示是为pthreads
的旧版本,因为有Collectable
接口,如果我没有弄错,现在自动实现Threaded
。
然后自述说:
泳池::收集机制,从游泳池到工人搬到了一个更强大的工人,简单的池继承。
所以我想我做错了什么。
编辑:我接过例如,从How does Pool::collect works?和更新,它与最新的并行线程和电流PHP7工作,但结果是一样的。它看起来不能从最后执行的线程收集结果。
Hello World from 1
Collecting 1
Hello World from 2
Collecting 2
Hello World from 3
Collecting 3
Hello World from 4
Collecting 4
Hello World from 5
Collecting 5
Hello World from 6
Hello World from 7
Collecting 6
Collecting 7
Hello World from 8
Hello World from 9
Hello World from 10