2011-06-02 156 views
0

我想知道遵循的最佳实践,以便在Python中的两个进程之间共享队列(资源)。这里是一个什么每道工序都做:在两个进程之间共享资源

Process_1:不断地从一个流API

Process_2获取数据(JSON格式):是一个守护进程(类似桑德马雷夏尔的code),它提交数据(一次一个)到数据库

所以,Process_1(或监制)把数据的一个单元到该共享资源,以及Process_2(或消费者)将轮询任何新的单元本共享资源如果有的话,将它们存储在数据库中。

有它来到我的脑海一些选项:

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

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

回答

3

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

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

+0

lvc:感谢您的建议。没有一个过程产生另一个过程。它们是独立创建的。 – ajmartin 2011-06-02 08:43:27