主义实体管理并行线程和Symfony的4

问题描述 投票:0回答:1

我使用PHP-ZTS以执行并行数据处理,使用的symfony 4和pthread

我在运行多线程伟大的,但我现在面临一个问题,我需要每个线程能够与理论工作

我需要确保每个线程能够教义工作

我试图将一个容器实例直接转移,但它不会工作,因为它不能被消毒

/console_com and.PHP

private function gettingStatistics(){
        $pool = new \Pool(4, Autoloader::class, ["vendor/autoload.php"]);
        $store = new \Threaded();
        $class = new Meta();
        $pool->submit(new Task($class,$store));
        $pool->collect();
        $pool->shutdown();
        $listQuotes = array();
        foreach ($store as $obj){
            foreach ($obj->{'response'} as $exchange => $data){
                $listQuotes[$exchange] = $data;
            }
        }
        unset($store);
        unset($interface);
        return $listQuotes;
    }

/autoloader.PHP

<?php
namespace App\Worker;

class Autoloader extends \Worker
{

    protected $loader;

    public function __construct($loader)
    {
        $this->loader = $loader;
    }

    /* включить автозагрузчик для задач */
    public function run()
    {
        require_once($this->loader);
    }

    /* переопределить поведение наследования по умолчанию для нового потокового контекста */
    public function start(int $options = PTHREADS_INHERIT_ALL)
    {
        return parent::start(PTHREADS_INHERIT_NONE);
    }

}

/auto loadable.PHP

<?php
namespace App\Worker;

/* нормальный, автоматически загруженный класс */

class Autoloadable
{
    public $response;

    public function __construct($greeting)
    {
        $this->response = $greeting->job();
    }
}

/task.PHP

<?php
namespace App\Worker;

class Task extends \Threaded
{
    protected $greeting;
    protected $result;

    public function __construct($greeting,\Threaded $store)
    {
        $this->greeting = $greeting;
        $this->result = $store;
    }

    public function run()
    {
        $greeting = new Autoloadable($this->greeting);
        $this->result[] = $greeting;
    }
}

我该如何通过正确的教义,以便能够从作业与它合作?

有在github上一个非常类似的问题,但我不能处理它。 https://github.com/krakjoe/pthreads/issues/369

php doctrine-orm symfony4
1个回答
0
投票

您是否尝试过在ObjectManager(你最后的代码块)的__construct需要一个Task实例?

this article的读

不能ATM测试它,没有ZTS设置,但我用这个在其他项目大获成功。

我希望你需要做的是这样的:

$pool = new Pool(4);

for ($i = 0; $i < 15; ++$i) {
    $pool->submit(new class($objectManager) extends \Threaded
    {
        private $objectManager;

        public function __construct(ObjectManager $objectManager)
        {
            $this->objectManager= $objectManager;
        }

        public function run()
        {
            // obviously replace the contents of this function
            $this->objectManager->performTask; 
            echo 'Job\'s done.' . PHP_EOL;
        }
    });
}

while ($pool->collect());

$pool->shutdown();

新的匿名类的实例采用目前$objectManager在当前的情况下,像/console_comand.php那里,并将它传递给这个新的匿名类以满足__construct要求。

链接的文章做了解释它比我做的,所以请给它一个读一个更好的工作。

© www.soinside.com 2019 - 2024. All rights reserved.