python - Multiprocessing.Pool() 卡住
问题描述
我处于将函数func
应用于长列表的情况。这是使用等效的东西完成的
long_list_processed = Pool().map(func, long_list)
这恰好产生了os.cpu_count()
进程。这段代码被调用了 10 次,但根据父进程只完成(非系统地)6-8 次。剩下的就永远卡住了——死锁。
我无法解决为什么会在这里发生死锁(这里没有任何共享状态)。另外,限制每个 Pool() 的进程数以避免上下文切换会更好吗?
编辑: func() 大致如下:
def check_contains(linestring, polygon):
if linestring.within(polygon):
return linestring
return None
因此,检查多边形中是否包含 Shapely 线串。
解决方案
细节太少,无法给出更好的答案,但如果func
写入日志或类似的东西,这可能就是问题所在。
每当父进程中的线程写入日志消息时,它都会将其添加到队列中。这涉及获取锁。
如果 fork() 发生在错误的时间,则锁以获取状态复制。
子进程复制父进程的日志配置——包括队列。
每当子进程写入日志消息时,它都会尝试将其写入队列。
这意味着获取锁,但锁已经被获取。
子进程现在等待释放锁。
锁永远不会被释放,因为释放它的线程没有被 fork() 复制。
来源:https ://pythonspeed.com/articles/python-multiprocessing/
推荐阅读
- autodesk-forge - AutoCAD 的设计自动化 - 超出了进程内存限制
- sql - 按日期计算前 5 个值
- python - 使用 pygame 或任何其他工具在 python 中形成二维数组后绘制一条线
- google-cloud-data-fusion - 数据融合:将运行时参数从一个管道传递到另一个管道
- elm - Elm 中其他类型列表的类型别名
- r - 如何为混合模型添加偏移量
- node.js - 与 Firestore 模拟器相比,Firestore 性能问题
- ansible - Ansible AWX - AWX 代表什么?
- c++ - 为什么没有 scm_timestamping 控制消息出现?
- css - IE11 flex:1 在父级没有固定高度时导致内容溢出