我将使用
有些令我困惑的是,有时它不能为所有任务获取结果:
现在缺少两行,分别是
看起来原始演示是针对旧版本的
然后readme上说:
“Pool::collect机制从Pool移动到Worker,以获得更强大的Worker和更简单的Pool继承。”
所以我想我做错了什么。 编辑:我从How does Pool::collect works?中获取了示例,并将其更新为与最新的pthreads和当前的PHP7兼容,但结果是相同的。看起来它无法收集执行的最后几个线程的结果。
这会输出以下内容,显然没有收集到所有的线程:
Pool
类的 pthreads PHP7 扩展最基本的演示(该演示 https://github.com/krakjoe/pthreads#polyfill)并进行了一些扩展,以便我可以从线程中获取结果(或者至少我认为我可以):$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
已经自动实现了它。然后readme上说:
“Pool::collect机制从Pool移动到Worker,以获得更强大的Worker和更简单的Pool继承。”
所以我想我做错了什么。 编辑:我从How does Pool::collect works?中获取了示例,并将其更新为与最新的pthreads和当前的PHP7兼容,但结果是相同的。看起来它无法收集执行的最后几个线程的结果。
$pool = new Pool(4);
while (@$i++<10) {
$pool->submit(new class($i) extends Thread implements Collectable {
public $id;
private $garbage;
public function __construct($id) {
$this->id = $id;
}
public function run() {
sleep(1);
printf(
"Hello World from %d\n", $this->id);
$this->setGarbage();
}
public function setGarbage() {
$this->garbage = true;
}
public function isGarbage(): bool {
return $this->garbage;
}
});
}
while ($pool->collect(function(Collectable $work){
printf(
"Collecting %d\n", $work->id);
return $work->isGarbage();
})) continue;
$pool->shutdown();
这会输出以下内容,显然没有收集到所有的线程:
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