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