2

我想知道在 Python 中的两个进程之间共享队列(资源)所遵循的最佳实践。这是每个进程正在执行的操作:

Process_1:不断从流式 API 获取数据(以 json 格式)

Process_2:是一个守护进程(类似于 Sander Marechal 的代码),它将数据(一次一个)提交到数据库中

因此,Process_1(或生产者)将一个数据单元放到该共享资源上,而Process_2(或消费者)将轮询该共享资源以获取任何新的数据单元,并将它们存储在数据库中(如果有)。

我想到了一些选择:

  • 使用pickle(缺点:酸洗和去酸洗的额外开销)
  • 通过stdoutProcess_1 向stdinProcess_2 传递数据(缺点:无,但不确定如何使用守护进程来实现)
  • 使用库pool中的对象multiprocessing(缺点:不确定如何将其编码为一个进程是守护进程)

我想要一个在这方面实践的最佳解决方案,带有一些代码:)。谢谢。

4

1 回答 1

6

multiprocessing.pool在这种情况下,这不是您想要的 - 它对于“在后台”(同时)完成多个工作单元很有用,而不是管理共享资源。由于您似乎已经确定了通信的格式,并且它们仅在一个方向上进行通信,因此您想要的是multiprocessing.Queue-文档有一个很好的例子来说明如何使用它——你会希望你的 Process_1 根据需要将数据放入队列中,并且 Process_2 在无限循环中调用 q.get() 。这将导致消费者在无事可做时阻塞,而不是像您建议的那样忙于等待(这会浪费处理器周期)。这留下的问题是关闭守护进程——可能最好的方法是让生产者在队列末尾放置一个标记值,以确保消费者处理所有请求。其他替代方法包括尝试在子进程退出时强行终止进程,但这很容易出错。

请注意,这假设生产者产生消费者(反之亦然) - 如果消费者是一个长期运行的守护进程,可以处理多个相对短命的生产者,情况变得相当困难 - 没有,我的知识,任何跨平台的高级 IPC 模块;处理此问题的最便携(通常也是最简单)的方法可能是将文件系统用作队列 - 在某处有一个 spool 文件夹,生产者为每个请求写入一个文本文件;然后消费者可以在闲暇时处理这些 - 但是,这并非没有自己的问题:您需要确保消费者不会尝试打开半写的指令文件,生产者不会踩到彼此的脚趾,并且生产者和消费者就请求的顺序达成一致。

于 2011-06-02T08:03:01.133 回答