如何使用PHP pthreads删除对可堆叠对象的所有引用?

时间:2015-06-16 14:40:50

标签: php multithreading pthreads

我在PHP中尝试使用pthreads。引用Joe的gist覆盖池,我创建了一个工作线程池,并提交可堆叠对象的实例。线程和工作都按照我的预期进行,但似乎主线程/上下文没有(完全)取消引用Stackable对象,因此内存使用量会无限增加,因为它会保留越来越多的实例。

它似乎清除/取消了可堆叠对象的所有属性,因此内存使用不会快速通过屋顶,但它确实会永远增加,所以这实际上不能用于长期运行的过程。我希望我做错了。以下示例代码将演示我的意思:

{{1}}

1 个答案:

答案 0 :(得分:1)

作为PHP7升级的一部分,pthreads v3已经有了很多改进。

您会发现此代码的PHP7版本按预期工作:

<?php
class W extends Worker {
    public function run(){}
}
class S extends Threaded implements Collectable {
    public $id;

    public function run() {
        $this->id = uniqid();
        $this->garbage = true;
    }

    public function __destruct () {
        if ($this->id === null) {
            echo "nullified stackable destroyed\n";
        } else {
            echo "stackable {$this->id} destroyed\n";
        }
    }

    public function isGarbage() : bool { return $this->garbage; }

    private $garbage = false;
}

$pool = new Pool(3, W::class);
$i = 0;
while ($i++ < 10) {
    $pool->submit(new S());
}

while ($pool->collect(function (S $s) {
    if ($s->isGarbage()) {
        echo "collected stackable {$s->id}\n";
    }
    return $s->isGarbage();
})) continue;

$pool->shutdown();
echo "script exit - here come the destructions of all the accumulated stackables\n";

建议新项目使用PHP7和pthreads v3,它远远优于PHP5和pthreads v2。