首页 > 解决方案 > 带有 PThreads 和 Symfony 4 的 Doctrine 实体管理器

问题描述

我正在使用 php-zts 执行并行数据处理,使用 symfony 4 和 PThreads

我很擅长运行多个线程,但是我遇到了一个问题,我需要每个线程都能够使用原则

我需要确保每个线程都能够使用学说

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

/console_comand.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;
    }

/自动加载器.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);
    }

}

/Autoloadable.php

<?php
namespace App\Worker;

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

class Autoloadable
{
    public $response;

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

/任务.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

标签: phpdoctrine-ormsymfony4

解决方案


您是否尝试过在(您的最后一个代码块)中要求一个实例ObjectManager__constructTask

阅读这篇文章

无法在 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要求。

链接的文章比我更好地解释它,所以请阅读它。


推荐阅读