4

由于多种原因(GIL、内存泄漏),我需要将应用程序转换为threading应用程序。multiprocessing幸运的是,线程非常孤立,仅通过Queue.Queues 进行通信。这个原语也可用,multiprocessing所以一切看起来都很好。现在,在我进入这个雷区之前,我想就即将出现的问题获得一些建议:

  1. 如何确保我的对象可以通过Queue? 我需要提供一些__setstate__吗?
  2. 我可以依靠put立即返回(如使用threading Queues)吗?
  3. 一般提示/提示?
  4. 除了Python 文档之外还有什么值得一读的吗?
4

1 回答 1

5

对第 1 部分的回答:

必须通过 a multiprocessing.QueuePipe或其他)的所有内容都必须是picklable。这包括基本类型,例如tuples、lists 和dicts。如果类是顶级的并且不太复杂(查看详细信息),也支持类。然而,试图传递lambdas 将失败。

对第 2 部分的回答:

Aput由两部分组成:它需要一个信号量来修改队列,它可以选择启动一个馈送线程。因此,如果没有其他人同时Process尝试put相同Queue的操作(例如,因为只有一次Process写入),它应该很快。对我来说,事实证明它对于所有实际目的都足够快。

第 3 部分的部分答案:

  • 平原multiprocessing.queue.Queue缺乏task_done方法,因此不能直接用作替代品。(子类提供该方法。)
  • 旧版本processing.queue.Queue缺少qsize方法,新multiprocessing版本不准确(请记住这一点)。
  • 由于文件描述符通常继承于fork,因此需要注意在正确的进程中关闭它们。
于 2010-11-25T11:16:12.350 回答