многопоточность — многопоточность PHP — как получить результаты из всех потоков, когда они будут готовы?

Я пытаюсь научиться многопоточности с помощью PHP. Я установил PHP 7.2.14 с поддержкой ZTS, просмотрел множество примеров в сети, а затем попытался создать простой скрипт, чтобы понять, понимаю ли я то, что узнал. Проблема в том, что, похоже, я не знаю 🙂

Вот сценарий, который я сделал:

class Task extends Threaded
{
private $workToBeDone;

public $DataHolder;

public function __construct($i, $z, $DataHolder)
{
$this->workToBeDone = array($i, $z);
$this->DataHolder = $DataHolder;
}

public function run()
{
$results = 0;

for ($i=$this->workToBeDone[0]; $i<=$this->workToBeDone[1]; $i++) {
$results++;
}

$this->synchronized(function ($DataHolder) use($results) {
echo $results . "\n";
$DataHolder->counter+=$results;
}, $this->DataHolder);
}
}

class MyDataHolder {
public $counter;
}

$DataHolder = new MyDataHolder;
$pool = new Pool(4);
$tasks = array();
for ($i = 0; $i < 15; ++$i) {
$Task = new Task(1,100, $DataHolder);
$pool->submit($Task);
}

while ($pool->collect());
$pool->shutdown();

echo "Total: " . $DataHolder->counter;

Этот скрипт должен создать 15 отдельных задач, и в каждой задаче мне нужно будет выполнить итерацию 100 раз. После того, как каждые 100 итераций будут готовы, я хотел бы сохранить количество повторений в MyDataHolder класс, чтобы иметь возможность получить к нему доступ позже.

Ожидается, что при запуске этого скрипта я бы хотел увидеть 100 распечатали 15 раз на экране, и в итоге хотелось бы увидеть Total: 1500 распечатанный.

Вместо этого, 100 распечатывается 15 раз, но общее значение остается пустым в конце.

Что я делаю неправильно? Как я могу собрать данные из каждого из моих потоков, чтобы использовать их позже в программе?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]