在两个进程之间共享资源
我想了解在Python中,如何在两个进程之间共享一个队列(资源)的最佳做法。下面是每个进程的工作内容:
进程_1:不断从一个流式API获取数据(格式是json)
进程_2:是一个守护进程(类似于Sander Marechal的代码),它将数据(每次一个)提交到数据库中
所以,进程_1(也叫生产者)会把一条数据放到这个共享资源上,而进程_2(也叫消费者)会定期检查这个共享资源,看是否有新的数据,如果有,就把它们存入数据库。
我想到了一些选项:
- 使用pickle(缺点是:有额外的序列化和反序列化开销)
- 通过进程_1的
stdout
将数据传递到进程_2的stdin
(缺点是:没有明显的缺点,但不确定如何在守护进程中实现这个) - 使用
multiprocessing
库中的pool
对象(缺点是:不确定如何编码,因为一个进程是守护进程)
我希望能得到一个在这方面的最佳解决方案,并附上代码示例。谢谢。
1 个回答
multiprocessing.pool
在这种情况下并不适合使用——它主要是用来让多个任务同时在“后台”运行,而不是用来管理共享资源。看起来你已经搞定了通信的格式,并且它们是单向的,所以你需要的是 multiprocessing.Queue
。在文档中有一个很好的使用示例。你需要让 Process_1 根据需要把数据放进队列,而 Process_2 则在一个无限循环中调用 q.get()。这样,当没有任务时,消费者会被阻塞,而不是像你提到的那样忙等待(这会浪费处理器的资源)。这个方法留下的问题是如何关闭守护进程——可能最好的办法是让生产者在队列末尾放一个哨兵值,以确保消费者处理完所有请求。其他的选择包括在子进程退出时强制杀死进程,但这容易出错。
需要注意的是,这里假设生产者是启动消费者的(或者反过来)。如果消费者是一个长时间运行的守护进程,能够处理多个相对短暂的生产者,那么情况就会复杂很多。根据我的了解,目前没有跨平台的高级进程间通信模块;处理这个问题最便携(通常也是最简单)的方法可能是使用文件系统作为队列——在某个地方有一个临时文件夹,生产者为每个请求写一个文本文件;然后消费者可以在方便的时候处理这些文件。不过,这样做也有自己的问题:你需要确保消费者不会尝试打开一个未写完的指令文件,生产者之间不会互相干扰,并且生产者和消费者需要对请求的顺序达成一致。