在Mac OSX上使用多进程时IDLE崩溃

0 投票
2 回答
1235 浏览
提问于 2025-04-18 14:24

如果我在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

撰写回答