多进程在交互模式下出现问题

12
我有以下代码:
from multiprocessing import Process, Queue
from queue import Empty
from time import sleep

def f(q):
    n = 100000000
    while n != 100000000 // 2:
        n -= 1
    q.put("the awkening!")
    print("my work here is done")

def main():
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    while True:
        try:
            print(q.get(block=False))
            raise systemexit
        except Empty:
            print("i found nothing :(")
            sleep(2)
    p.join()

如果我添加
if __name__ == '__main__':
     main()

最后使用python script_name.py来运行它,一切都很顺利。然而,如果我只是使用python -i script_name.py运行脚本,然后运行main(),Python会抱怨:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python34\lib\multiprocessing\spawn.py", line 98, in spawn_main
    exitcode = _main(fd)
  File "C:\Python34\lib\multiprocessing\spawn.py", line 108, in _main
    self = pickle.load(from_parent)
AttributeError: Can't get attribute 'f' on <module '__main__' (built-in)>

出现错误是由于子进程,主进程正常运行。

这不是什么大问题,但我想知道为什么会发生这种情况,同时如果可以在交互模式下运行就更好了。

1个回答

15
多进程文档中提到:

注意

该包内的功能需要子进程能够导入 __main__ 模块。在编程指南中已经涵盖了此问题,但在这里指出也是值得注意的。这意味着一些示例,例如 multiprocessing.Pool 示例,在交互式解释器中将无法工作。

我的理解是,在交互式会话的上下文中,__main__ 的定义与文件运行时不同(因为它与 shell 相关,而不是正在运行的文件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接