【问题标题】:What is the difference between a Queue and a JoinableQueue in multiprocessing in Python?Python中多处理中的Queue和JoinableQueue有什么区别?
【发布时间】:2020-07-13 17:25:56
【问题描述】:

Python 多处理中的 Queue 和 JoinableQueue 有什么区别?这个问题已经被问到here,但正如一些 cmets 指出的那样,接受的答案没有帮助,因为它所做的只是引用文档。有人可以解释何时使用一种与另一种的区别吗?例如,如果 JoinableQueue 除了提供两个额外的方法join() 和task_done() 之外,为什么还要选择使用Queue 而不是JoinableQueue。此外,我链接到的帖子中的另一个答案提到了Based on the documentation, it's hard to be sure that Queue is actually empty.,这再次提出了一个问题,即我为什么要使用队列而不是 JoinableQueue?它有什么优势?

【问题讨论】:

    标签: python queue


    【解决方案1】:

    multiprocessing 将其队列从queue.Queue 中提取出来。在该模型中,Queue 保留队列中所有内容的“任务计数”。通常有两种方法可以使用这个队列。生产者可以只是把事情放在队列上,而忽略从长远来看会发生在他们身上的事情。如果队列已满,生产者可能会不时等待,但并不关心放在队列中的任何东西是否真正被消费者处理。在这种情况下,队列的任务数会增加,但谁在乎呢?

    或者,生产者可以“加入”队列。这意味着它一直等到队列中的最后一个任务被处理并且任务计数变为零。但要做到这一点,生产者需要消费者的帮助。消费者从队列中获取项目,但这不会减少任务计数。消费者必须主动调用task_done(通常是在任务完成时...),join 将等到每个 put 都有一个 task_done。

    快进到multiprocessing。 task_done 机制需要进程之间的通信,这是相对昂贵的。如果你是不玩join 游戏的A 类制作人,请使用multiprocessing.Queue 并节省一点CPU 时间。如果您是 B 类生产者,请使用 multiprocessing.JoinableQueue。但请记住,消费者也必须玩 task_done 游戏,否则生产者会挂掉。

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多