Позвольте мне ответить: из того, что я знаю о pthreads в php, пул похож на число обрабатывающих php.exe, которые могут быть запущены одновременно.
Итак, в вашем случае вы определяете два пула с помощью new Pool(2, 'Worker', []);
Итак, давайте сделаем абстрактное объяснение по этому поводу. Есть 2 пула, назовите его PoolA
и PoolB
.
Цикл от 0 до 3, каждый цикл отправляет задачу в Пул.
Есть 4 задачи от 0 до 3, давайте их вызывать по task0
, task1
, task2
, task3
.
Когда цикл происходит, с моей точки зрения, это должна быть очередь, подобная этой
PoolA -> submit task0
PoolB -> submit task1
PoolA -> submit task2
PoolB -> submit task3
Но с class Work
это будет задача0, ... до задачи3.
Положение / состояние
Вы определяете некоторую логику в run () =>, когда параметр (в данном случае $ id из конструктора) равен 0, тогда sleep(3)
.
В этой ситуации PoolA
означает, что task0
, содержащий параметр ($ id), имеет значение 0, PoolA
будет ожидать 3 секунды. PoolA
также отправьте task2
.
С другой стороны, PoolB
отправить task1
и task3
, из этой ситуации не нужно ждать 3 секунды.
Таким образом, при запуске while($pool->collect());
возможная очередь, которая вероятнее всего произойдет
task1 (PoolB)
task3 (PoolB)
task0 (PoolA) ->>>> PoolA delayed because from task0 needs to sleep for 3 seconds
task2 (PoolA)
Так что я думаю, что это правильно, когда выходные данные
1 готов
3 готово
0 готово
2 готово
Есть вопросы.
Почему задерживается только PoolA, даже если задерживается PoolA, почему задача 2 не отправляется в PoolB или почему задача 1 или задача 3 не передаются в PoolA ??
Ну, я тоже не понимаю. У меня есть задача, похожая на вашу, после многих экспериментов, я не уверен, pthreads , которые используют Pool & Threaded
, это multi-threading or multiprocessing
.