在两个进程之间共享资源

ajm*_*tin 2 python producer-consumer shared-resource

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

Process_1:从流式API连续获取数据(JSON格式)

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

因此,Process_1(或Producer)将一个数据单元放到此共享资源上,而Process_2(或Consumer)将在此共享资源中轮询任何新的数据单元,并将它们存储在DB中(如果有)。

我想到了一些选择:

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

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

lvc*_*lvc 6

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

请注意,这是假设生产者产生了消费者(反之亦然)-如果消费者是一个长期运行的守护进程,可以处理多个相对短暂的生产者,则情况会变得更加困难-不会据我所知,任何跨平台的高级IPC模块;处理此问题的最可移植(通常是最简单)的方法可能是使用文件系统作为队列-在生产者为每个请求编写文本文件的位置放置一个假脱机文件夹;消费者随后可以随意处理这些内容-但是,这并非没有问题:您需要确保消费者不要试图打开半写的指令文件,生产者也不要踩踏彼此的脚趾,并且生产者和消费者同意请求的顺序。