【发布时间】:2019-01-15 12:19:48
【问题描述】:
我正在尝试使用 PHP 学习多线程。我已经安装了支持ZTS的PHP 7.2.14,并在网上查看了很多示例,然后尝试创建一个简单的脚本,看看我是否理解我所学到的东西。问题是,看来,我没有:)
这是我制作的脚本:
class Task extends Threaded
{
private $workToBeDone;
public $DataHolder;
public function __construct($i, $z, $DataHolder)
{
$this->workToBeDone = array($i, $z);
$this->DataHolder = $DataHolder;
}
public function run()
{
$results = 0;
for ($i=$this->workToBeDone[0]; $i<=$this->workToBeDone[1]; $i++) {
$results++;
}
$this->synchronized(function ($DataHolder) use($results) {
echo $results . "\n";
$DataHolder->counter+=$results;
}, $this->DataHolder);
}
}
class MyDataHolder {
public $counter;
}
$DataHolder = new MyDataHolder;
$pool = new Pool(4);
$tasks = array();
for ($i = 0; $i < 15; ++$i) {
$Task = new Task(1,100, $DataHolder);
$pool->submit($Task);
}
while ($pool->collect());
$pool->shutdown();
echo "Total: " . $DataHolder->counter;
这个脚本应该创建 15 个单独的任务,并且在每个任务中我必须迭代 100 次。在每 100 次迭代准备就绪后,我想将我迭代的次数存储在 MyDataHolder 类中,以便以后能够访问它。
预期的行为是,当我运行此脚本时,我希望看到 100 在屏幕上打印 15 次,最后,我希望看到 Total: 1500 打印出来。
与此不同,100 被打印了 15 次,但最后的总值仍然为空。
我做错了什么?如何从我的每个线程中收集数据,以便稍后在程序中使用?
【问题讨论】:
-
this question and answer 有帮助吗?
标签: php multithreading php-pthread