问题描述
帮助我了解Pool :: collect的工作原理。
Help me understand how exactly Pool::collect works.
池:: collect - 收集已完成任务的参考
Pool::collect — Collect references to completed tasks
public void Pool::collect ( Callable $collector )
$我假设是: Pool :: collect 注册一个函数,它将在每个 \ Threaded $ task 完成。所以,我做了:
What I assume was: Pool::collect registers a function, which will be called after each \Threaded $task is completed. So, I did:
<?php $pool = new Pool(4); $pool->collect($collector); $pool->submit(new Task);
无法使用。但以下操作:
Didn't work. But the following does:
<?php $pool = new Pool(4); $pool->submit(new Task); $pool->collect($collector);
所以,我猜想 Pool :: collect 是:将 $ collector 附加到先前提交的每个 \Threaded $ task 。
So, I guess what Pool::collect does is: attaches the $collector to each \Threaded $task previously submitted.
现在,当调用 $ collector 时?我假设在 Threaded :: run()完成后调用。再次错误。
Now, when exactly the $collector is called? I assume was called after Threaded::run() is completed. Wrong again.
<?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
文档没有多说。没有事件说, $ collector 必须返回一个布尔值。 。
The documentation doesn't say much. Doesn't event say that the $collector must return a boolean value. I didn't know that.
我试图使用Pool :: collect作为一种回调在每个$任务完成后。
Edit 1. What about this attempt?
推荐答案
c $ c>遍历将每个对象传递给 $ collector 的对象列表。
<$ c $当引擎可以销毁对 Threaded $ collector 函数应返回 true >对象。
The ::collect functionality was moved to Worker, though it's still exposed by Pool for utility.
:: collect 功能已移到 Worker ,尽管它仍然由池 >
有两个列表,一个准备执行的项目列表,以及已执行(或正在执行)的另一个项目。
There are two lists, one list of items ready to be executed, and another of items that have been executed (or is currently being executed).
Pool :: collect 遍历第二个列表,即已执行(或正在执行)的项目。
Pool::collect traverses the second list, items that have been executed (or is currently being executed).
Pool :: collect 返回所有 Worker Pool 中的对象以帮助安排垃圾收集。
Pool::collect returns the number of items still left in the garbage list for all Worker objects in the Pool to aid with scheduling garbage collection.
<?php $pool = new Pool(4); while (@$i++<10) { $pool->submit(new class($i) extends Collectable { public function __construct($id) { $this->id = $id; } public function run() { printf( "Hello World from %d\n", $this->id); $this->setGarbage(); } 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 9 Collecting 10
注意 9 出现两次;第一次它是当前正在执行的对象,因此它再次收集。
Notice that Collecting 9 appears twice; The first time it is the object currently being executed, and so it comes up for collection again.
这篇关于Pool :: collect如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!