Я пытаюсь научиться многопоточности с помощью 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 раз, но общее значение остается пустым в конце.
Что я делаю неправильно? Как я могу собрать данные из каждого из моих потоков, чтобы использовать их позже в программе?
Задача ещё не решена.
Других решений пока нет …