php - 带有 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
解决方案
您是否尝试过在(您的最后一个代码块)中要求一个实例ObjectManager
?__construct
Task
阅读这篇文章
无法在 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
要求。
链接的文章比我更好地解释它,所以请阅读它。
推荐阅读
- installation - 如何在 NSIS 中为 https 调用传递用户名和密码
- image - 从 URL 获取图像 - Power Apps
- magento2 - 用于保存配置 magento 2 的插件
- python - HTML页面图标未显示在Django中
- c - void 指针,并重新转换为所需的类型
- pine-script - pine 脚本 - ADX 指示修改
- reference - 防止 Visual Studio 2017 将近 100 个不必要的系统 dll 复制到 dll 项目的输出文件夹
- ios - 应用程序崩溃并调用 [ServicesDaemonManager] interruptHandler。-[FontServicesDaemonManager 连接]_block_invoke
- javascript - 如何使用 Selenium 和 Python 从由空格分隔的文本节点获取文本
- fonts - 无法嵌入字体时的位图文本