Позвольте мне ответить: из того, что я знаю о 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.
Ситуация / условие
blockquote>Вы определяете некоторую логику в 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 готовы
blockquote>
[ 1123] 3 готово
0 готово
2 готовоЕсть вопросы.
Почему задерживается только PoolA, даже если задерживается PoolA, почему task2 не отправляется в PoolB или почему task1 или task3 не отправляются в PoolA ??
blockquote>Что ж, я не понимаю тоже не понимаю. У меня есть задача, похожая на вашу, после многих экспериментов я не уверен, что pthreads , которые используют
Pool & Threaded
, этоmulti-threading or multiprocessing
.
Как документация Apple о глубоких копиях явно состояния:
, Если Вам только нужно один уровень глубоко копия:
NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES];
вышеупомянутый код создает новый массив, участники которого являются мелкими копиями членов старого массива.
Примечание, что, если необходимо глубоко скопировать всю вложенную структуру данных —, что связанные документы Apple называют истинная глубокая копия — тогда, этот подход не будет достаточен. См. другие ответы здесь для этого.
Единственным путем я знаю, чтобы легко сделать, это должно заархивировать и затем сразу разархивировать Ваш массив. Это чувствует себя подобно определенному взлому, но на самом деле явно предлагается в Документация Apple относительно копирования наборов , который указывает:
при необходимости в истинной глубокой копии, такой как тогда, когда у Вас есть массив массивов, можно заархивировать и затем разархивировать набор, обеспечил содержание, которому все приспосабливают протоколу NSCoding. Пример этой техники показывают в Списке 3 Списков 3.
истинную глубокую копию
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData: [NSKeyedArchiver archivedDataWithRootObject:oldArray]];
, выгода - то, что Ваш объект должен поддерживать интерфейс NSCoding, так как это будет использоваться для хранившего/загружения данных.
let trueDeepCopyArray = NSKeyedUnarchiver.unarchiveObjectWithData(
NSKeyedArchiver.archivedDataWithRootObject(oldArray))