我Pool
在 PHP 中使用对象pthread
,并制作了以下测试脚本,以查看池应该如何工作。我认为,池化应该做的是获得给定数量的任务,打开最大x
数量的工人,并分配给他们任务,一旦工人完成任务,如果有更多任务可用,分配给那个工人一个新的任务。
给定以下示例和上述假设:
class Work extends Threaded {
public $id;
public function __construct($id) {
$this->id = $id;
}
public function run() {
if ($this->id == 0) {
sleep(3);
echo $this->id . " is ready\n";
return;
} else {
echo $this->id . " is ready\n";
return;
}
}
}
$pool = new Pool(2, 'Worker', []);
for ($i=0; $i<4; $i++) $pool->submit(new Work($i));
while ($pool->collect());
$pool->shutdown();
我期待这个脚本输出以下信息:
1 准备好了
2 准备好了
3 准备好了
0 准备好了
因为,基本上有 2 个工人可用,并且由于sleep
第一个工人偶然发现的操作,任务 1,2,3 必须由第二个工人完成。
而不是这个,我得到的输出是:
1 准备好了
3 准备好了
0 准备好了
2 准备好了
很明显,工人 1 在开始时被分配了作业 0 和作业 2,因此工人 2 在完成作业 1 和作业 3 后只是等待,而不是从工人 1 那里接管作业 2。
这是一个错误吗?还是打算以这种方式工作?
我的 PHP 版本:
PHP 7.2.14 (cli) (built: Jan 9 2019 22:23:26) ( ZTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies