Python多处理starmap\u async未终止?

Python多处理starmap\u async未终止?,python,jupyter-notebook,multiprocessing,Python,Jupyter Notebook,Multiprocessing,我正在尝试使用starmap\u async方法来测试具有多个参数的多处理,我的Jupyter笔记本中确实有这样的功能: 导入多处理 def测试异步(i、j、k、l): 打印(i、j、k、l) 将multiprocessing.Pool(processs=4)作为池: 结果=pool.starmap_async(test_async,[(1,2,3,4,4,5),(3,4,5,6),(4,5,6,7),(5,6,7,8)]) result.get() 此单元格从不终止,它始终处于*状态。当我强

我正在尝试使用
starmap\u async
方法来测试具有多个参数的多处理,我的Jupyter笔记本中确实有这样的功能:

导入多处理
def测试异步(i、j、k、l):
打印(i、j、k、l)
将multiprocessing.Pool(processs=4)作为池:
结果=pool.starmap_async(test_async,[(1,2,3,4,4,5),(3,4,5,6),(4,5,6,7),(5,6,7,8)])
result.get()
此单元格从不终止,它始终处于*状态。当我强制终止它时,我得到了错误

---------------------------------------------------------------------------
键盘中断回溯(最后一次最近调用)
在里面
4多进程池(进程=4)作为池:
5 result=pool.starmap_async(test_async,[(1,2,3,4,4,5)、(3,4,5,6)、(4,5,6,7)])
---->6.result.get()
7.加入
get中的~/miniconda3/lib/python3.8/multiprocessing/pool.py(self,超时)
763
764 def get(自身,超时=无):
-->765自我等待(超时)
766如果不是self.ready():
767上升时间错误
~/miniconda3/lib/python3.8/multiprocessing/pool.py处于等待状态(self,超时)
760
761 def等待(自身,超时=无):
-->762自身事件等待(超时)
763
764 def get(自身,超时=无):
~/miniconda3/lib/python3.8/threading.py处于等待状态(self,超时)
556信号=自身标志
557如果未发出信号:
-->558信号=自身第二次等待(超时)
559返回信号
560
~/miniconda3/lib/python3.8/threading.py处于等待状态(self,超时)
300 try:#无论发生什么情况都恢复状态(例如键盘中断)
301如果超时为无:
-->302服务员
303 gotit=正确
304.其他:
键盘中断:
我错过什么了吗


更新:所以我实际上意识到了
.close()
.join()
问题,我尝试了所有可能的组合,包括完全省略这两个函数,它不会改变任何东西。我正在寻找Jupyter特定的解决方案。

是的,您缺少了一些东西。你的“with”部分必须在里面

if __name__ == "__main__":

文档对此提出了警告。请记住,在执行多处理时,每个新进程都从头开始,并且必须重新加载主文件。除非你有
\uu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;我就是找不到。无论如何,解决方案是将函数
test\u async
放在一个模块中,例如,worker.py,然后:

导入多处理
从辅助程序导入测试\u异步
#Windows需要:
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
将multiprocessing.Pool(processs=4)作为池:
结果=pool.starmap_async(test_async,[(1,2,3,4,4,5),(3,4,5,6),(4,5,6,7),(5,6,7,8)])
result.get()
#pool.join()#在未首先调用pool.close()的情况下无法调用此函数
例如,如果worker.py与包含此单元格的笔记本文件位于同一目录中,则根据定义
worker.py
将位于模块搜索路径上的目录中

顺便说一下,您的代码相当于:

导入多处理
从辅助程序导入测试\u异步
#Windows需要:
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
将multiprocessing.Pool(processs=4)作为池:
starmap(test_async,[(1,2,3,4),(2,3,4,5),(3,4,5,6),(4,5,6,7),(5,6,7,8)])

没有必要在
pool.close()
之后再加上
pool.join()
,因为你一直在等待所有提交的任务完成。

不过我用的是Jupyter笔记本。我认为名字检查不起作用;它仍然挂起。这是一个问题,当产卵而不是分叉-它通常只出现在Windows上。多处理尝试检测问题并引发错误。如果已修复代码,请向我们显示已修复的代码。您需要在加入之前调用close(请参阅),但由于这是在with块中,因此您既不关闭也不加入。删除close命令,它就可以在我的linux机器上的命令行上工作。我不知道事情的主要方面。