Pracuję z mclapply
z pakietu multicore
(w systemie Ubuntu) i piszę funkcję, która wymaga, aby wyniki mclapply(x, f)
zostały zwrócone w kolejności (tj. f(x[1]), f(x[2]), ...., f(x[n])
).Czy mclapply gwarantuje, że zwróci wyniki w kolejności?
# multicore doesn't work on Windows
require(multicore)
unlist(mclapply(
1:10,
function(x){
Sys.sleep(sample(1:5, size = 1))
identity(x)}, mc.cores = 2))
[1] 1 2 3 4 5 6 7 8 9 10
Powyższy kod wydaje się sugerować, że mclapply
zwraca wyniki w tej samej kolejności co lapply
.
Jednakże, jeśli to założenie jest błędne, będę musiał poświęcić wiele czasu na refaktoryzację mojego kodu, więc mam nadzieję uzyskać pewność od kogoś bardziej zaznajomionego z tym pakietem/przetwarzaniem równoległym, że to założenie jest poprawne.
Czy można bezpiecznie założyć, że mclapply
zawsze zwraca wyniki w kolejności, niezależnie od opcjonalnych argumentów, które są podane?
Docs nie wskazują, że wynik może przyjść jajecznica, i to jest jednoznaczne, że jest to równoległe wersja 'lapply', która zwraca listę uporządkowaną jako dane wejściowe. Można uruchomić część kodu w trybie sekwencyjnym i równoległym i sprawdzić, czy ma to zastosowanie w konkretnym przypadku. Zaryzykowałbym przypuszczenie, że tak. –