首页 > 解决方案 > 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 线串。

标签: pythonmultiprocessingdeadlock

解决方案


细节太少,无法给出更好的答案,但如果func写入日志或类似的东西,这可能就是问题所在。

  1. 每当父进程中的线程写入日志消息时,它都会将其添加到队列中。这涉及获取锁。

  2. 如果 fork() 发生在错误的时间,则锁以获取状态复制。

  3. 子进程复制父进程的日志配置——包括队列。

  4. 每当子进程写入日志消息时,它都会尝试将其写入队列。

  5. 这意味着获取锁,但锁已经被获取。

  6. 子进程现在等待释放锁。

  7. 锁永远不会被释放,因为释放它的线程没有被 fork() 复制。

来源:https ://pythonspeed.com/articles/python-multiprocessing/


推荐阅读