Сбой IDLE при использовании многопроцессорной обработки в Mac OSX

Если я запущу этот простой код в IDLE в Python 2.7.8, появится окно с сообщением: «Программа все еще работает! Вы хотите ее убить?».

from multiprocessing import Pool

def foo(x):
    return x**2

if __name__ == '__main__':
    pool = Pool(2)
    pows = pool.map(foo, range(10))
    print pows

Даже если я убью или нет (он спросит дважды), ничего не произойдет. Раньше я использовал Windows и только недавно начал использовать Mac OSX (10.9.4), и я не знаю, упустил ли я что-то здесь.

Если я запускаю тот же код непосредственно в оболочке Python в терминале, он будет работать нормально. То же самое в ноутбуке iPython. Это просто не будет в IDLE, всплывающее окно сообщения.

Любые идеи? Я бы хотел продолжать использовать IDLE...

вот журнал:

INFO:root:10221: Started process
INFO:root:10221: Defined foo
INFO:root:10221: __name__ == '__main__'
INFO:root:10221: pool created

person Alessandro Mariani    schedule 23.07.2014    source источник
comment
Выдает ли он какой-либо результат? (например, выполняется ли оператор печати?)   -  person Tom Dalton    schedule 23.07.2014
comment
никакого результата... независимо от того, решил я убить или нет. курсор моргает в консоли и ничего не происходит. похоже, та же проблема, что и здесь /вопросы/20760876/   -  person Alessandro Mariani    schedule 23.07.2014
comment
Когда я запускаю это из редактора IDLE с 2.7.13 на Win10, он сразу же печатает [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]. Я не знаю, чем обусловлена ​​разница между ОС или версией, но я рекомендую использовать IDLE с более поздними версиями 2.x или 3.x.   -  person Terry Jan Reedy    schedule 15.08.2017


Ответы (2)


Это была известная проблема с предыдущей версией Pycharm. Если вы обновитесь до последней версии сейчас, вы можете безопасно использовать многопроцессорность в консоли IDE, не запуская больше эту проблему.

Дополнительную информацию см. здесь: https://youtrack.jetbrains.com/issue/PY-14969< /а>

person Community    schedule 23.02.2017

Ссылка на это: https://docs.python.org/2/library/multiprocessing.html#introduction

В частности, в примечании:

Функциональность этого пакета требует, чтобы дочерние элементы могли импортировать модуль __main__. Это описано в Руководстве по программированию, однако стоит упомянуть здесь. Это означает, что некоторые примеры, такие как multiprocessing.Pool, не будут работать в интерактивном интерпретаторе."

Вот аналогичный вопрос Дочерние процессы, созданные с помощью многопроцессорного модуля python, не будут распечатать

Пример записи активности в файл:

#!/usr/bin/env python

import logging
from multiprocessing import Pool
import os

logging.basicConfig(filename='example.log',level=logging.DEBUG)

def log_msg(msg):
    logging.info("{}: {}".format(os.getpid(), msg))

log_msg("Started process")

def foo(x):
    log_msg("running foo")
    return x**2

log_msg("Defined foo")

if __name__ == '__main__':
    log_msg("__name__ == '__main__'")

    pool = Pool(2)
    log_msg("pool created")
    pows = pool.map(foo, range(10))
    log_msg("map completed")
    print pows
    log_msg("output printed")

log_msg("Finished running")

Пример вывода для меня:

tom@fannybawz:~$ ./multiproc.py
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
tom@fannybawz:~$ cat example.log 
INFO:root:22238: Started process
INFO:root:22238: Defined foo
INFO:root:22238: __name__ == '__main__'
INFO:root:22238: pool created
INFO:root:22240: {}: running foo
INFO:root:22239: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22239: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22239: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22239: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22238: map completed
INFO:root:22238: output printed
INFO:root:22238: Finished running
tom@fannybawz:~$ 

Попробуйте сделать то же самое с версией Process.

person Tom Dalton    schedule 23.07.2014
comment
Я не думаю, что это мой случай, точно такой же код работает в интерактивном интерпретаторе в терминале... - person Alessandro Mariani; 23.07.2014
comment
Если он работает в интерактивном интерпретаторе (и предположительно, если вы запускаете его как файл python mymodule.py), но не работает в IDLE, значит проблема в IDLE. - person Tom Dalton; 23.07.2014
comment
Возможно, стоит попробовать использовать Process вместо Pool, чтобы увидеть, сможете ли вы точно определить, где проблема возникает в IDLE - похоже, что вызов блокируется неожиданно/на неопределенный срок. - person Tom Dalton; 23.07.2014
comment
да - это только IDLE, я пытался указать в своем самом первом вопросе! Я получаю ту же ошибку, используя процесс, так что это как-то связано с многопроцессорностью :( - person Alessandro Mariani; 23.07.2014
comment
Таким образом, проблема должна быть связана с тем, как IDLE запускает ваш модуль, верно? Можете ли вы добавить ведение журнала, чтобы точно определить, когда и где он блокируется? Например. при вызове Process().start() ? - person Tom Dalton; 23.07.2014
comment
используя пул, он блокируется в пуле = пул (2). Использование Process с кодом, представленным на docs.python.org/2. /library/ он блокируется в p.join()... надеюсь, это имеет смысл! - person Alessandro Mariani; 23.07.2014
comment
Интересный. В случае процесса, который предполагает, что подпроцесс порождается, но никогда не завершается. Возможно, стоит добавить ведение журнала в файл, чтобы вы могли отслеживать, что делает подпроцесс, и посмотреть, сможете ли вы определить, в какой момент он зависает (при условии, что это так). - person Tom Dalton; 23.07.2014
comment
какие-либо предложения о том, как создать этот журнал? хД - person Alessandro Mariani; 23.07.2014
comment
«Похожий вопрос», упомянутый выше, совершенно другой, потому что проблема (ошибочно диагностируемая большинством ответов) заключается в порожденных процессах, пытающихся записать в несуществующий стандартный вывод. Пример здесь печатается только в главном процессе и отлично работает на 2.7.13 в Win10. - person Terry Jan Reedy; 15.08.2017