我想知道Python中两个进程之间共享队列(资源)的最佳实践。以下是每个流程的操作:
进程1:连续从流式api获取数据(json格式)
进程2:是一个守护进程(类似于sandermarechal的code),它将数据(一次一个)提交到数据库中
因此,进程1将一个数据单元放入这个共享资源中,进程2将轮询这个共享资源中的任何新数据单元,并将它们存储在数据库中(如果有的话)。在
我想到了一些选择:
stdout
传递数据
到进程2的stdin
(缺点:没有,但不确定如何用守护程序实现)multiprocessing
库中的pool
对象(缺点:不确定如何将其编码为一个进程是守护进程)我想要一个最佳的解决方案,在这方面,与一些代码:)。谢谢。在
在本例中,
multiprocessing.pool
不是您想要的,它对于在后台(同时)完成多个工作单元非常有用,而对于管理共享资源来说就不那么有用了。由于您似乎已经确定了通信的格式,而且它们只在一个方向上通信,所以您需要的是multiprocessing.Queue
,documentation有一个很好的例子来说明如何使用它-您需要让您的进程1根据需要将数据放入队列中,并且进程2在无限循环中调用q.get()。这将导致使用者在无事可做时阻塞,而不是像您建议的那样忙着等待(这可能会浪费处理器周期)。这留下的问题是关闭守护进程-可能最好的方法是让生产者在队列的末尾放置一个sentinel值,以确保使用者处理所有请求。其他替代方法包括尝试在子进程退出时强行终止进程,但这很容易出错。在注意,这假设生产者产生消费者(反之亦然),如果消费者是一个长期运行的守护进程,可以处理多个相对短暂的生产者,情况会变得相当困难-据我所知,没有任何跨平台的高级IPC模块;最可移植(通常也是最容易)的方式处理这可能是使用文件系统作为一个队列-在某处有一个假脱机文件夹,生产者可以为每个请求写入一个文本文件;然后消费者可以随意处理这些文件-但是,这并非没有它自己的问题:您需要确保使用者不会试图打开半写的指令文件,生产商没有相互干涉,生产商和消费者就请求的顺序达成一致。在
相关问题 更多 >
编程相关推荐