Глубоко копирование NSArray

Позвольте мне ответить: из того, что я знаю о 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 готовы
[ 1123] 3 готово
0 готово
2 готово

blockquote>

Есть вопросы.

Почему задерживается только PoolA, даже если задерживается PoolA, почему task2 не отправляется в PoolB или почему task1 или task3 не отправляются в PoolA ??

blockquote>

Что ж, я не понимаю тоже не понимаю. У меня есть задача, похожая на вашу, после многих экспериментов я не уверен, что pthreads , которые используют Pool & Threaded, это multi-threading or multiprocessing.

117
задан Josh Caswell 28 November 2013 в 19:39
поделиться

2 ответа

Как документация Apple о глубоких копиях явно состояния:

, Если Вам только нужно один уровень глубоко копия:

NSMutableArray *newArray = [[NSMutableArray alloc] 
                             initWithArray:oldArray copyItems:YES];

вышеупомянутый код создает новый массив, участники которого являются мелкими копиями членов старого массива.

Примечание, что, если необходимо глубоко скопировать всю вложенную структуру данных —, что связанные документы Apple называют истинная глубокая копия — тогда, этот подход не будет достаточен. См. другие ответы здесь для этого.

207
ответ дан Paulo Mattos 24 November 2019 в 02:04
поделиться

Единственным путем я знаю, чтобы легко сделать, это должно заархивировать и затем сразу разархивировать Ваш массив. Это чувствует себя подобно определенному взлому, но на самом деле явно предлагается в Документация Apple относительно копирования наборов , который указывает:

при необходимости в истинной глубокой копии, такой как тогда, когда у Вас есть массив массивов, можно заархивировать и затем разархивировать набор, обеспечил содержание, которому все приспосабливают протоколу NSCoding. Пример этой техники показывают в Списке 3 Списков 3.

истинную глубокую копию

NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
          [NSKeyedArchiver archivedDataWithRootObject:oldArray]];

, выгода - то, что Ваш объект должен поддерживать интерфейс NSCoding, так как это будет использоваться для хранившего/загружения данных.

версия Swift 2:

let trueDeepCopyArray = NSKeyedUnarchiver.unarchiveObjectWithData(
    NSKeyedArchiver.archivedDataWithRootObject(oldArray))
60
ответ дан Vahid 24 November 2019 в 02:04
поделиться