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

标签 php callback pthreads threadpool

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

相关文章:

PHP,启用 ZTS,Pthreads

php - Python 开发 - 将结果存储在 for 循环中

javascript - 如何使用 ActiveDirectory 2 返回 AD 组的成员?

php - 比较字符串的意外结果

python - 在 Python 和 C 之间实现回调

android - 使用 TweetComposer 发送推文时回调?

c - 使用 pthreads/cond_signal/cond_wait 时如何考虑循环缓冲区大小 1?

C++ - 线程和多队列

php - 如何修复 laravel Seed 中的 UTF8?

php - 查找 PHP 代码中 preg_* 函数中使用的所有模式