我使用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
您是否尝试过在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
要求。
链接的文章做了解释它比我做的,所以请给它一个读一个更好的工作。