在Mac OSX上使用多进程时IDLE崩溃
如果我在Python 2.7.8的IDLE里运行这段简单的代码,它会弹出一个窗口,提示“程序仍在运行!你想要结束它吗?”
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 Shell里运行同样的代码,它就能正常运行。在iPython笔记本里也是一样。就是在IDLE里不行,总是弹出那个提示框。
有没有什么想法?我想继续使用IDLE……
这是日志:
INFO:root:10221: Started process
INFO:root:10221: Defined foo
INFO:root:10221: __name__ == '__main__'
INFO:root:10221: pool created
2 个回答
1
参考这个链接:
https://docs.python.org/2/library/multiprocessing.html#introduction
特别是在说明中提到:
这个包里的功能要求
__main__
模块能被子进程导入。这个在编程指南里有讲,但在这里提一下也很重要。这意味着一些例子,比如multiprocessing.Pool
的例子,在交互式解释器中是无法运行的。
这里有个类似的问题:用Python的multiprocessing模块创建的子进程无法打印
记录活动到文件的例子:
#!/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版本做同样的事情。
0
这是之前版本的Pycharm一个已知的问题。如果你现在升级到最新版本,就可以在IDE的控制台中安全地使用多进程功能,不会再遇到这个问题了。
想了解更多信息,可以查看这里: https://youtrack.jetbrains.com/issue/PY-14969