Я не могу заставить PthreadsV3 работать с Symfony 4.1.4.
Запуск простого подтверждения концепции в одном файле PHP работает, как и ожидалось, но при перемещении в Symfony ContainerAwareCommand
Меня приветствует следующая ошибка.
Неустранимая ошибка: необработанное исключение: сериализация «Закрытие» не является
разрешено в [нет активного файла]: 0 Трассировка стека:
У меня такое ощущение, что это связано с копированием и сериализацией контейнера Symfony в классе \ Threaded. Я пытался исключить Thread
, Threaded
а также Worker
пространства имен в списке исключений в services.yaml после предложения в сообщение об ошибке но это не решило это.
Может кто-нибудь объяснить мне, что я делаю не так. В настоящее время я не уверен, возможен ли Symfony 4 с Pthreads.
Следующий код работает из одного файла php.
<?php
$pool = new \Pool(4, TickerWorker::class, []);
for ($i = 0; $i < 10; $i++) {
$pool->submit(new TickerTask($i));
}
while ($pool->collect()) ;
$pool->shutdown();
echo "Pool done\n";
class TickerWorker extends \Worker
{
public function __construct()
{
}
}
class TickerTask extends \Threaded
{
protected $complete;
private $i;
public function __construct($i)
{
echo "$i start\n";
$this->i = $i;
$this->complete = false;
}
public function run()
{
sleep(rand(1, 3));
echo "$this->i done\n";
$this->complete = true;
}
public function isComplete()
{
return $this->complete;
}
}
Это не работает и выдает исключение
<?php
namespace App\Command;
use App\Pthread\TickerTask;
use App\Pthread\TickerWorker;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Where App\Pthread\TickerWorker and App\Pthread\TickerTask
* are the classes as defined in the working example
*/
class CoconutTestCommand extends ContainerAwareCommand
{
protected static $defaultName = 'coconut:test';
protected function execute(InputInterface $input, OutputInterface $output)
{
$pool = new \Pool(4, TickerWorker::class, []);
for ($i = 0; $i < 10; $i++) {
$pool->submit(new TickerTask($i));
}
while ($pool->collect()) ;
$pool->shutdown();
echo "Pool done\n";
}
}
Детали среды:
Внутри команды symfony (2.8) я не заставляю поток (3) работать.
Моя версия php:
PHP 7.2.9-dev (cli) (сборка: 5 сентября 2018 14:13:58) (ZTS)
Но как альтернативное решение:
Других решений пока нет …