我想知道在 Python 中的两个进程之间共享队列(资源)的最佳实践。这是每个进程正在做的事情:
Process_1:不断从流式 api 获取数据(json 格式)
Process_2: 是一个守护进程(类似于 Sander Marechal 的 code ),它将数据(一次一个)提交到数据库中
因此,Process_1(或 Producer)将一个数据单元放入此共享资源,Process_2(或 Consumer)将轮询此共享资源以获取任何新的数据单元数据,并将它们存储在数据库中(如果有的话)。
我想到了一些选项:
- 使用 pickle(缺点:酸洗和去酸洗的额外开销)
- 通过 Process_1 的
stdout
传递数据 到 Process_2 的stdin
(缺点:没有,但不确定如何使用守护进程实现) - 使用
multiprocessing
库中的pool
对象(缺点:不确定如何编码,因为一个进程是守护进程)
我想要一个在这方面实践的最佳解决方案,以及一些代码:)。谢谢。
最佳答案
multiprocessing.pool
在这种情况下不是您想要的 - 它对于在“后台”(同时)完成多个工作单元很有用,而不是管理共享资源.由于您似乎已经确定了通信格式,并且它们仅在一个方向上通信,因此您需要的是 multiprocessing.Queue
- documentation有一个很好的例子来说明如何使用它——您将希望您的 Process_1 根据需要将数据放入 Queue,而 Process_2 在无限循环中调用 q.get() 。这将导致消费者在无事可做时阻塞,而不是像您建议的那样忙等待(这会浪费处理器周期)。这留下的问题是关闭守护进程——最好的方法可能是让生产者在队列末尾放置一个哨兵值,以确保消费者处理所有请求。其他替代方案包括在子进程退出时尝试强行终止进程,但这很容易出错。
请注意,这是假设生产者产生消费者(反之亦然)——如果消费者是一个长期运行的守护进程,可以处理多个相对短暂的生产者,情况会变得相当困难——没有t,据我所知,任何跨平台的高级 IPC 模块;处理这个问题的最便携(通常也是最简单)的方法可能是将文件系统用作队列——在某处有一个假脱机文件夹,生产者为每个请求写入一个文本文件;然后消费者可以在闲暇时处理这些 - 然而,这并非没有自己的问题:您需要确保消费者不会尝试打开半写的指令文件,生产者不会踩到彼此的脚趾,并且生产者和消费者就请求的顺序达成一致。
关于python - 在两个进程之间共享资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6211654/