Как убить работника doMC, когда он будет готов?

Документация для doMC кажется очень скудной, в ней перечислены только doMC-package и registerDoMC(). Проблема, с которой я сталкиваюсь, заключается в том, что я создаю несколько рабочих процессов через doMC/foreach, но затем, когда работа выполнена, они просто сидят и занимают память. Я могу пойти и поискать их идентификаторы процессов, но я часто случайно убиваю главный процесс.

library(doMC)
library(foreach)

registerDoMC(32)

foreach(i=1:32) %dopar% foo()

##kill command here?

Я пробовал использовать registerDoSEQ(), но, похоже, это не убивает процессы.


person Patrick McCarthy    schedule 13.02.2014    source источник
comment
возможно, parallel::stopCluster мог бы это сделать, но у меня нет опыта работы с doMC   -  person Carl Witthoft    schedule 13.02.2014
comment
Глядя на все ужасные предупреждения на страницах справки doMC, я бы рекомендовал вместо этого использовать другие кластерные пакеты.   -  person Carl Witthoft    schedule 13.02.2014


Ответы (4)


Пакет doMC, по сути, представляет собой оболочку для функции mclapply, и mclapply разветвляет рабочие процессы, которые должны завершиться до того, как он вернется. Он не использует постоянных рабочих процессов, таких как пакет snow или производные от snow функции в пакете parallel, поэтому ему не нужна функция вроде stopCluster для завершения работы рабочих процессов.

Вы видите ту же проблему при непосредственном использовании mclapply? Работает ли это лучше, когда вы вызываете registerDoMC с меньшим значением для ядер?

Используете ли вы doMC из IDE, такой как RStudio или R.app, на Mac? Если это так, вы можете попробовать использовать R из терминала, чтобы увидеть, имеет ли это значение. Может возникнуть проблема с вызовом fork в среде IDE.

person Steve Weston    schedule 14.02.2014

Я так и не нашел подходящего решения для doMC, поэтому какое-то время делал следующее:

library(doParallel)
cl <- makePSOCKcluster(4) # number of cores to use
registerDoParallel(cl)

## computation

stopCluster(cl)

Работает каждый раз.

person Patrick McCarthy    schedule 04.04.2016

если вы используете пакет doParallel и используете registerDoParallel(8) с числами, вы можете использовать unloadNamespace("doParallel"), чтобы убить мультипроцесс

И если у вас есть имя для кластеров, вы можете использовать stopCluster(cl) для удаления дополнительных рабочих процессов.

person cloudscomputes    schedule 09.11.2019

Используя registerDoSEQ(), вы просто регистрируете последовательный рабочий процесс, поэтому все параллельные рабочие процессы должны остановиться. Это не полное решение, но в некоторых случаях оно должно работать.

person Marcelo Bielsa    schedule 29.11.2016