多处理在交互模式下中断

XrX*_*rXr 11 python multiprocessing

我有以下代码

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()
Run Code Online (Sandbox Code Playgroud)

如果我加

if __name__ == '__main__':
     main()
Run Code Online (Sandbox Code Playgroud)

到最后然后用python script_name.py它来运行它,一切正常.但是,如果我只是运行scirpt 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)>
Run Code Online (Sandbox Code Playgroud)

错误来自子进程,主进程运行正常.

这不是什么大问题,但我想知道为什么会发生这种情况,如果它在交互模式下工作也会很好

sap*_*api 14

多文档讨论了这一点:

注意

此程序包中的功能要求__main__模块可由子项导入.这在编程指南中有所涉及,但值得在此指出.这意味着某些示例(例如multiprocessing.Pool示例)在交互式解释器中不起作用.

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