我目前正在学习PHP中的多线程。我已经知道多线程的基本知识,例如创建线程并一起运行多个线程,但是我仍然对Worker和Pool感到困惑。
目前,我有这个脚本:
<?php
class MyWork extends Threaded {
public $name;
public function __construct($name) {
echo "Constructing worker $name\n";
$this->name = $name;
}
public function run() {
echo "Worker $this->name start running\n";
for ($i = 1; $i <= 5; $i++) {
echo "Worker $this->name : $i\n";
sleep(1);
}
}
}
class MyWorker extends Worker {
public function run() {}
}
$pool = new Pool(1, \MyWorker::class);
$pool->submit(new MyWork("A"));
$pool->submit(new MyWork("B"));
$pool->submit(new MyWork("C"));
以我的理解,这应该创建一个最多只能同时运行1个工人的工人池,对吗?因此,我期望这种输出:
Constructing worker A
Constructing worker B
Constructing worker C
Worker A start running
Worker A : 1
Worker A : 2
Worker A : 3
Worker A : 4
Worker A : 5
Worker B start running
Worker B : 1
Worker B : 2
Worker B : 3
Worker B : 4
Worker B : 5
Worker C start running
Worker C : 1
Worker C : 2
Worker C : 3
Worker C : 4
Worker C : 5
但是,这是我得到的:
Constructing worker A
Constructing worker B
Worker A start running
Constructing worker C
Worker A : 1
Worker : 2
Worker : 3
Worker : 4
Worker : 5
Worker start running
Worker : 1
Worker : 2
Worker : 3
Worker : 4
Worker : 5
Worker start running
Worker : 1
Worker : 2
Worker : 3
Worker : 4
Worker : 5
为什么工人的名字只出现一次然后就消失了?
注意:我在Windows 8.1上将PHP 5.5.10与phtreads 2.0.4一起使用,并且通过CLI运行脚本。
在脚本的末尾(在最后一个commit()之后),工作线程被销毁,并且池在仍在执行对象时进入关闭状态,这说明了名称消失的原因。
做这个
$pool = new Pool(1, \MyWorker::class);
$pool->submit(new MyWork("A"));
$pool->submit(new MyWork("B"));
$pool->submit(new MyWork("C"));
$pool->shutdown();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句