gpt4 book ai didi

php - Pool::collect 是如何工作的?

转载 作者:可可西里 更新时间:2023-11-01 00:43:06 25 4
gpt4 key购买 nike

帮助我了解 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

$collectorThreaded::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::collectPool 中的所有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com