我试图在 Python 3 中以最简单的方式应用多处理,但它在我的笔记本电脑上不起作用。我正在使用Windows。
from multiprocessing import Process
# a dummy function
def f(x):
print(x)
if __name__ == '__main__':
p = Process(target=f, args=('some text',))
p.start()
p.join()
print('Done')
Run Code Online (Sandbox Code Playgroud)
事情并没有像预想的那样结束。相反,我得到了这个错误:
Run Code Online (Sandbox Code Playgroud)Traceback (most recent call last): File "C:\Users\Mahdi\anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3437, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-2-46a0e604292b>", line 1, in <module> runfile('C:/Users/Mahdi/Mahdi Code/test.py', wdir='C:/Users/Mahdi/Mahdi Code') File "C:\Program Files\JetBrains\PyCharm 2021.2.2\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line 198, in runfile pydev_imports.execfile(filename, global_vars, local_vars) # execute the script File "C:\Program Files\JetBrains\PyCharm 2021.2.2\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "C:/Users/Mahdi/Mahdi Code/test.py", line 25, in <module> p.start() File "C:\Users\Mahdi\anaconda3\lib\multiprocessing\process.py", line 121, in start self._popen = self._Popen(self) File "C:\Users\Mahdi\anaconda3\lib\multiprocessing\context.py", line 224, in _Popen return _default_context.get_context().Process._Popen(process_obj) File "C:\Users\Mahdi\anaconda3\lib\multiprocessing\context.py", line 327, in _Popen return Popen(process_obj) File "C:\Users\Mahdi\anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 93, in __init__ reduction.dump(process_obj, to_child) File "C:\Users\Mahdi\anaconda3\lib\multiprocessing\reduction.py", line 60, in dump ForkingPickler(file, protocol).dump(obj) _pickle.PicklingError: Can't pickle <function f at 0x00000218267C3D30>: attribute lookup f on __main__ failed Done Traceback (most recent call last): File "<string>", line 1, in <module> File "C:\Users\Mahdi\anaconda3\lib\multiprocessing\spawn.py", line 116, in spawn_main exitcode = _main(fd, parent_sentinel) File "C:\Users\Mahdi\anaconda3\lib\multiprocessing\spawn.py", line 126, in _main self = reduction.pickle.load(from_parent) EOFError: Ran out of input
有人知道这件事吗?
一些交互式 IDE 不支持多处理,例如 jupyter lab,有一些涉及非标准多处理模块的技巧,但最直接的解决方案是不使用多处理代码的交互式环境,而是在脚本模式下运行 python使用 VsCode 或 Pycharm 或通过终端。(Spyder 也可以工作,但你必须将代码作为脚本运行)