Ответ 1
Короткий ответ: он возвращает результаты в правильном порядке.
Но, конечно, вы должны сами прочитать код (mclapply
- это функция R...)
Страница руководства для collect
дает несколько советов:
Примечание. Если expr использует низкоуровневые многоядерные функции, такие как sendMaster, одно задание может выдавать результаты несколько раз, и пользователь должен правильно их интерпретировать.
Однако, если вы не испортите уровень низкого уровня,
collect возвращает любые результаты, доступные в списке. Результаты будут иметь тот же порядок, что и заданные задания. Если есть несколько заданий и задание имеет имя, оно будет использоваться для обозначения результата, в противном случае будет использоваться его идентификатор процесса.
(мой акцент)
Теперь для mclapply
.
Быстрый поиск исходного кода дает:
- если
!mc.preschedule
и больше нет заданий, чем ядер (length (X) <= cores
)parallel
иcollect
, см. выше. - Если
mc.preschedule
или больше заданий, чем ядра,mclapply
сам позаботится о порядке - см. код.
Однако здесь немного измененная версия вашего эксперимента:
> unlist (mclapply(1:10, function(x){
Sys.sleep(sample(1:5, size = 1));
cat (x, " ");
identity(x)},
mc.cores = 2, mc.preschedule = FALSE))
1 2 4 3 6 5 7 8 9 10 [1] 1 2 3 4 5 6 7 8 9 10
> unlist (mclapply(1:10, function(x){
Sys.sleep(sample(1:5, size = 1));
cat (x, " ");
identity(x)},
mc.cores = 2, mc.preschedule = TRUE))
1 3 2 5 4 6 7 8 10 9 [1] 1 2 3 4 5 6 7 8 9 10
Что показывает, что результаты возвращаются в другом порядке дочерними заданиями (точнее: дочерние задания заканчиваются в другом порядке), но результат собран в исходном порядке.
(работает на консоли, но не в RStudio - cat
там не отображается)