多进程在交互模式下失效

12 投票
1 回答
5346 浏览
提问于 2025-04-18 11:25

我有以下这段代码:

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

multiprocessing 文档中提到了一些内容:

注意

这个包里的功能要求 __main__ 模块能够被子进程导入。这在编程指南中有说明,但在这里提一下也是值得的。这意味着一些示例,比如 multiprocessing.Pool 的示例,在交互式解释器中是无法运行的。

我的理解是,在交互式会话中,__main__ 的定义和在文件中运行时是很不一样的(因为它和命令行有关,而不是和正在运行的文件有关)。

撰写回答