使用 pdb 运行时多处理代码失败?

Max*_*der 6 python python-3.x pdb python-multiprocessing

Python Multiprocessing相关的错误:AttributeError: module '__main__' has no attribute '__spec__',但由不同情况引起。

当我尝试使用 pdb 运行多处理代码时,我在 Python 3.7.4 中遇到了一个问题。该问题与https://docs.python.org/3.6/library/multiprocessing.html 中的基本多处理示例相同:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)

这个运行正常(输出[1, 4, 9]时在Python经由直接运行)python.exe testcase.py。但是,它在 pdb 下不起作用;python.exe -m pdb testcase.py失败并出现错误:

Traceback (most recent call last):
  File "c:\python37\lib\pdb.py", line 1697, in main
    pdb._runscript(mainpyfile)
  File "c:\python37\lib\pdb.py", line 1566, in _runscript
    self.run(statement)
  File "c:\python37\lib\bdb.py", line 585, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "c:\users\max\desktop\projects\errortest.py", line 1, in <module>
    from multiprocessing import Pool
  File "c:\python37\lib\multiprocessing\context.py", line 119, in Pool
    context=self.get_context())
  File "c:\python37\lib\multiprocessing\pool.py", line 176, in __init__
    self._repopulate_pool()
  File "c:\python37\lib\multiprocessing\pool.py", line 241, in _repopulate_pool
    w.start()
  File "c:\python37\lib\multiprocessing\process.py", line 112, in start
    self._popen = self._Popen(self)
  File "c:\python37\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "c:\python37\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "c:\python37\lib\multiprocessing\spawn.py", line 172, in get_preparation_data
    main_mod_name = getattr(main_module.__spec__, "name", None)
AttributeError: module '__main__' has no attribute '__spec__'
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> c:\python37\lib\multiprocessing\spawn.py(172)get_preparation_data()
-> main_mod_name = getattr(main_module.__spec__, "name", None)
Run Code Online (Sandbox Code Playgroud)

我很犹豫地认为我在一对模块中发现了一个错误,这些模块十多年来一直是 Python 的重要组成部分。这里有什么不正确的吗?

ter*_*rth 3

这是 Windows 中多处理的限制。问题很好地解释了为什么会这样。快速谷歌搜索显示 puDB 可能能够帮助调试多处理代码,但我以前没有使用过它。

以下内容来自python 文档

该包中的功能要求子模块可以导入主模块。编程指南中对此进行了介绍,但值得在此指出。这意味着某些示例(例如multiprocessing.pool.Pool示例)将无法在交互式解释器中运行。