帮助我了解 Pool::collect 的工作原理。
Pool::collect — 收集对已完成任务的引用
public void Pool::collect ( Callable $collector )
我的假设是:Pool::collect
注册一个函数,该函数将在每个 \Threaded $task
完成后调用。所以,我做了:
<?php
$pool = new Pool(4);
$pool->collect($collector);
$pool->submit(new Task);
没用。但以下内容确实如此:
<?php
$pool = new Pool(4);
$pool->submit(new Task);
$pool->collect($collector);
所以,我想 Pool::collect
所做的是:将 $collector
附加到之前提交的每个 \Threaded $task
。
现在,什么时候调用 $collector
?我假设是在 Threaded::run()
完成后调用的。又错了。
<?php
class Task extends Threaded {
public function run () { echo "Task complete\n"; }
}
$collector = function (\Task $task) {
echo "Collect task\n";
return true;
};
$pool = new Pool(4);
$pool->submit(new Task);
$pool->collect($collector);
$pool->shutdown();
输出:
Collect task
Task complete
$collector
在 Threaded::run()
完成之前调用。
文档没有说太多。不会说 $collector
必须返回 bool 值。 I didn't know that .
我试图在每个 $task 完成后使用 Pool::collect 作为一种回调。我想我走错了路。
编辑 1。What about this attempt ?
最佳答案
Pool::collect
遍历对象列表,将每个对象传递给 $collector
。
当引擎可以销毁对工作列表中的Threaded
对象的引用时,$collector
函数应返回true
。
在 PHP7 中
::collect
功能已移至 Worker
,但它仍由 Pool
公开以供实用。
有两个列表,一个列表是准备执行的项目,另一个是已经执行(或正在执行)的项目。
Pool::collect
遍历第二个列表,已执行(或正在执行)的项目。
Pool::collect
为 Pool
中的所有 Worker
对象返回垃圾列表中剩余的项目数,以帮助调度垃圾回收。
PHP7代码
<?php
$pool = new Pool(4);
while (@$i++<10) {
$pool->submit(new class($i) extends Threaded {
public function __construct($id) {
$this->id = $id;
}
public function run() {
printf(
"Hello World from %d\n", $this->id);
}
public $id;
});
}
while ($pool->collect(function(Collectable $work){
printf(
"Collecting %d\n", $work->id);
return $work->isGarbage();
})) continue;
$pool->shutdown();
?>
会产生类似的东西:
Hello World from 1
Hello World from 2
Hello World from 3
Hello World from 4
Hello World from 8
Collecting 1
Hello World from 7
Hello World from 5
Collecting 5
Hello World from 6
Collecting 9
Collecting 2
Collecting 6
Collecting 10
Hello World from 9
Collecting 3
Collecting 7
Collecting 4
Hello World from 10
Collecting 8
Collecting 5
Collecting 10
关于php - Pool::collect 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28416842/