在两个进程之间共享资源

时间:2011-06-02 07:24:03

标签: python producer-consumer shared-resource

我想知道在Python中的两个进程之间共享队列(资源)之后的最佳实践。以下是每个流程正在做的事情:

Process_1:从流式传输API继续获取数据(采用json格式)

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

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

我想到了一些选择:

  • 使用泡菜(缺点:酸洗和去酸洗的额外开销)
  • 通过Process_1的stdout传递数据 到Process_2的stdin(缺点:无,但不确定如何使用守护进程实现此功能)
  • 使用pool库中的multiprocessing对象(缺点:不确定如何将此代码编码为一个进程是一个守护进程)

我想在这方面实践最佳解决方案,有些代码:)。感谢。

1 个答案:

答案 0 :(得分:5)

在这种情况下,

multiprocessing.pool不是您想要的 - 在后台(同时)完成多个工作单元非常有用,而不是管理共享资源。由于您似乎已经制定了通信的格式,并且它们只在一个方向上进行通信,您想要的是multiprocessing.Queue - documentation有一个很好的示例如何使用它 - 您将希望您的Process_1根据需要将数据放入队列,并且Process_2在无限循环中调用q.get()。这会导致消费者在没有任何事情要做时阻止,而不是像你建议的那样忙着等待(这会浪费处理器周期)。这留下的问题是关闭守护进程 - 可能最好的方法是让Producer在队列末尾放置一个sentinel值,以确保Consumer处理所有请求。其他替代方案包括在孩子退出时试图强行杀死进程,但这很容易出错。

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