импорт целевых функций | многопроцессорная обработка - PullRequest
0 голосов
/ 27 января 2012

Я хочу изучить многопроцессорность в Python. Я начал читать http://www.doughellmann.com/PyMOTW/multiprocessing/basics.html, и я не могу понять раздел об импорте целевых функций.

В частности, что означает следующее предложение ..

«Оборачивание основной части приложения в проверку на __main__ гарантирует, что оно не запускается рекурсивно для каждого дочернего элемента при импорте модуля.»

Может кто-нибудь объяснить это более подробно на примере?

Ответы [ 4 ]

0 голосов
/ 27 января 2012

В Windows модуль multiprocessing импортирует модуль __main__ при порождении нового процесса.Если код, который порождает новый процесс, не заключен в блок if __name__ == '__main__', то импорт основного модуля снова вызовет новый процесс.И так до бесконечности.

Эта проблема также упоминается в многопроцессорной документации в разделе, озаглавленном «Безопасный импорт основного модуля». Там вы найдете следующий простой пример:

Запуск этого в Windows:

from multiprocessing import Process

def foo():
    print 'hello'

p = Process(target=foo)
p.start()

приводит к RuntimeError.

И исправление должно использовать:

if __name__ == '__main__':    
    p = Process(target=foo)
    p.start()
0 голосов
/ 27 января 2012

Гарантирует, что выполняемый скрипт находится в «среде верхнего уровня» для интерактивности.

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

if __name__ == '__main__':
    do_something()
0 голосов
/ 27 января 2012
"""This is my module (mymodule.py)"""

def sum(a,b):
    """>>> sum(1,1)
       2
       >>> sum(1,-1)
       0
    """
    return a+b

# if you run this module using 'python mymodule.py', run a self test
# if you just import this module, you get foo() and other definitions,
# but the self-test isn't run
if __name__=='__main__':
    import doctest
    doctest.testmod()
...