在队列为空之前调用 join 时,Python 3 多处理队列死锁

2023-11-26

我对理解队列中的队列有疑问multiprocessingpython 3中的模块

这就是他们在编程指南:

请记住,已将项目放入队列的进程将在之前等待 终止,直到所有缓冲的项目都被“feeder”线程送入 底层管道。 (子进程可以调用 Queue.cancel_join_thread 队列的方法来避免这种行为。)

这意味着每当您使用队列时,您都需要确保所有 已放入队列的项目最终将在 进程已加入。否则你无法确定哪些进程有 将项目放入队列将终止。还要记住非守护进程 进程将自动加入。

会出现死锁的示例如下:


from multiprocessing import Process, Queue

def f(q):
    q.put('X' * 1000000)

if __name__ == '__main__':
    queue = Queue()
    p = Process(target=f, args=(queue,))
    p.start()
    p.join()                    # this deadlocks
    obj = queue.get()
  

这里的修复方法是交换最后两行(或者简单地删除 p.join() 行)。

所以显然,queue.get()不应在 a 之后调用join().

然而,有一些使用队列的例子,其中get在 a 之后调用join like:

import multiprocessing as mp
import random
import string

# define a example function
def rand_string(length, output):
    """ Generates a random string of numbers, lower- and uppercase chars. """
    rand_str = ''.join(random.choice(
                string.ascii_lowercase
                + string.ascii_uppercase
                + string.digits)
    for i in range(length))
        output.put(rand_str)

 if __name__ == "__main__":
     # Define an output queue
     output = mp.Queue()

     # Setup a list of processes that we want to run
     processes = [mp.Process(target=rand_string, args=(5, output))
                    for x in range(2)]

     # Run processes
    for p in processes:
        p.start()

    # Exit the completed processes
    for p in processes:
        p.join()

    # Get process results from the output queue
    results = [output.get() for p in processes]

    print(results)

我已经运行了这个程序并且它可以工作(也作为 StackOverFlow 问题的解决方案发布Python 3 - 多重处理 - Queue.get() 没有响应).

有人可以帮我理解这里僵局的规则是什么吗?


多处理中允许数据在进程之间传输的队列实现依赖于标准操作系统管道。

操作系统管道不是无限长的,因此在操作系统中对数据进行排队的进程可能会被阻塞put()操作直到其他进程使用get()从队列中检索数据。

对于少量数据,例如您示例中的数据,主进程可以join()所有生成的子进程,然后获取数据。这通常运作良好,但无法扩展,并且不清楚何时会崩溃。

但它肯定会随着大量数据而崩溃。子进程将被阻塞在put()等待主进程从队列中删除一些数据get(),但主进程被阻塞在join()等待子进程完成。这导致了僵局。

这是一个用户有的示例这个确切的问题。我在那里的答案中发布了一些代码,帮助他解决了他的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在队列为空之前调用 join 时,Python 3 多处理队列死锁 的相关文章

随机推荐

  • threading.local() 是在 Google AppEngine 中存储单个请求的变量的安全方法吗?

    我有一个 google appengine 应用程序 我只想为该请求设置一个全局变量 我可以这样做吗 在request vars py中 request vars py global vars threading local 在另一个 py
  • 在 Fortran 中打开二进制文件:状态、表单、访问

    我使用 Fortran 已有多年 但文件 I O 对我来说仍然很模糊 我的理解status form access recl是有限的 因为我在研究生院需要某些用例 我知道 Fortran 二进制文件在文件顶部有描述文件大小的额外信息 但这对
  • 无法使用response.sendRedirect进行重定向

    我在 google 上搜索了好几个小时 了解如何在 jsp 或 servlet 中进行重定向 然而 当我尝试应用它时 它不起作用 我在jsp页面内的代码 我从调试中知道 regexp 有效 并且如果有任何时候 articleId 不是数字
  • Android 布局参数仅更改宽度和高度

    我知道如何使用设置视图的宽度和高度LayoutParams通过执行以下操作 android view ViewGroup LayoutParams params button getLayoutParams params width hei
  • 可以运行的最大 Swing 工作线程数是多少

    可以运行的 Swing Worker 线程数是否有上限 或者是内存支持的上限 这也可以在某处配置吗 A SwingWorker本身不是线程 而是将在线程中执行的任务 通常 您会使用ExecutorService执行实例SwingWorker
  • C# 将一个列表拆分为多个列表

    我有一个发送到队列的字符串列表 我需要拆分列表 以便最终得到一个列表列表 其中每个列表包含最大 用户定义 数量的字符串 例如 如果我有一个包含以下 A B C D E F G H I 的列表 并且列表的最大大小为 4 我希望最终得到一个列表
  • 如何在Windows上安装tesserocr?

    我下载了 tesseract OCR 的可执行文件并安装了它 另一方面 我还从以下位置下载了 leptonica 的 zip 文件 http www leptonica com download html 它包括两个目录 即lib and
  • 在Python中应用时变过滤器

    我正在尝试使用 Python 将具有时变截止频率的带通滤波器应用于信号 我当前使用的例程将信号划分为等长的时间段 然后对于每个段 我应用具有特定时间参数的滤波器 然后将信号合并在一起 这些参数基于预先存在的估计 我似乎遇到的问题是 应用过滤
  • MySQL:连续月份的记录计数

    我已经四处寻找这个 但所有类似的问题和答案都不同 无法工作 我有一个包含以下字段的表 人 事 purdate 当一个人购买每一件新东西时 就会输入一个新记录 我想计算一个人连续几个月购买了任何东西 thing01 或 thing02 没关系
  • 在 R 中复制矩阵的行

    假设我有一个矩阵m和一个正整数向量v 我想做的是得到一个新的矩阵m new和每一行m say m i 被复制v i 次在m new 例如 m matrix 1 6 nrow 3 1 2 1 1 4 2 2 5 3 3 6 v c 3 1 2
  • 为什么 GCC 不在编译时评估 constexpr?

    举个例子 class something public static constexpr int seconds int hour int min int sec return hour 3600 min 60 sec then print
  • JFreeChart - 将图表线的 SeriesStroke 从实线更改为单线虚线

    此处接受的答案 JFreechart Java 如何绘制部分虚线和部分实线的线 帮助我开始改变图表上的系列划线 在单步执行我的代码并观察更改后 我发现我的系列笔画实际上在应该的时候 在某个日期 dashedAfter 之后 更改为 dash
  • 陷入 Azure OAuth2 令牌请求中的两个错误之间

    我正在为 OWIN 和 Azure Active Directory 实现 OAuth2 提供程序 FWIW 目前 OpenId Connect 选项不符合这项工作的要求 我获得一个身份验证代码 并使用 auth code 状态返回到我的回
  • 在反向传播中使用 sigmoid 函数计算误差

    我有一个关于反向传播的简单问题 我正在看以下内容 http www4 rgu ac uk files chapter3 20 20bp pdf 在这篇论文中 它说计算神经元的误差为 Error 输出 i 1 输出 i 目标 i 输出 i 我
  • 达到内存限制时 NSCache 崩溃(仅在 iOS 7 上)

    我们在应用程序中使用 NSCache 作为 UIImages 这在小于 7 的 iOS 版本上工作得很好 当发生内存警告时 NSCache 按预期释放对象 然而 在 iOS 7 上 我们的应用程序在第一次内存警告后不久就崩溃了 因此 似乎使
  • 工具栏外观中的 extjs 按钮

    嘿 我确实有一个小问题 但我似乎无法找到答案 当我在 extjs 工具栏中放置一个按钮时 它会以默认外观出现 就像任何 Windows 工具栏选项一样 我如何使它看起来像表单中的按钮 尝试这样 tbar xtype button text
  • 如何检索这台计算机的IP地址?

    检索机器 IP 地址 第一个打开的接口 的最不麻烦 模块包含 代码长度等 的方法是什么 我知道一些使用 MSINET 的解决方案 但我相信我们可以做得更好 不要回复 Function HomeIP as Atring HomeIP 127
  • 加载没有 Segue 的 StoryBoard 视图

    我真的很喜欢将所有视图都放在故事板中 但有时我会看到一个基于代码生成的按钮显示的视图 因此不会有 Segue 引用 它将完全断开连接故事板 不过 我仍然想在故事板中设计它 这样我就可以对所有屏幕有一个很好的概览 当加载 UIViewCont
  • iOS应用程序更新测试

    有没有一种方法可以测试应用程序何时更新 我很尴尬 因为有一个错误只在应用程序更新时出现 并且没有调查 如果您问是否想通过应用程序商店查找应用程序何时更新 我不知道有这样的方法 执行此操作的一种黑客方法是将当前应用程序版本保存到 NSUser
  • 在队列为空之前调用 join 时,Python 3 多处理队列死锁

    我对理解队列中的队列有疑问multiprocessingpython 3中的模块 这就是他们在编程指南 请记住 已将项目放入队列的进程将在之前等待 终止 直到所有缓冲的项目都被 feeder 线程送入 底层管道 子进程可以调用 Queue