понедельник, 16 июля 2012 г.

Внезапный цикл при использовании multiprocessing. Есть ответ!

Разбирался я с запуском алгоритма в нескольких процессах. Для начала я понял, что через IDLE multiprocessing тестировать невозможно. Написал файл:

import multiprocessing,sys
def parent(numproc=2):
 print ('at start')
 childs=[]
 print ('bfore Pipe')
 (parentEnd,childEnd)=multiprocessing.Pipe()
 # for i in range(numproc):
 i=0
 print ('printing i:',i)
 child=multiprocessing.Process(target=child_proc, args=(childEnd,i))
 print ('created child')
 child.start()
 print ('started child')
 print ('joining child')
 child.join()
 print ('joined child')
 print ('exeted from for i in childs')
 mins=[1,2]
 print ('task ended. result: ',min(mins))
def child_proc(pipe,name):
 pass
if __name__ == '__main__':
 parent()

Всё работает:
at start
bfore Pipe
printing i: 0
created child
started child
joining child
joined child
exeted from for i in childs
task ended. result:  1

Но если в конце файла поместить не
if __name__ == '__main__':
 parent()

а просто вызов функции parent() - процесс вываливается во внезапный цикл...
at start
bfore Pipe
printing i: 0
created child
started child
joining child
at start
bfore Pipe
printing i: 0
created child
started child
joining child
at start
bfore Pipe
printing i: 0
created child
started child
joining child
Traceback (most recent call last):
Есть у кого-нибудь соображения, с чем это связано?

UPD: оказывается, это ограничения windows - дочерний процесс импортирует весь модуль и потому запускает функцию ещё раз. Отсюда

2 комментария:

  1. Цикл там потому что multiprocessing начинает исполнять файл целиком то есть без "if __name__ == '__main__': parent()" parent будет вызывается в каждом процессе и собственно будем иметь то что имеем.

    ОтветитьУдалить
    Ответы
    1. а почему вдруг-то он будет исполнять файл целиком? я же в отдельный процесс передаю только одну функцию...

      Удалить