python - 在两个进程之间共享资源

标签 python producer-consumer shared-resource

我想知道在 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/

相关文章:

c++ - 是否有处理这种共享资源情况的设计模式或基本的面向对象原则?

c# - 在多个项目中使用相同的类

python : is it ok returning both boolean and string?

python - 如何将Python版本降级到Python 2.7.13(默认,2017年11月7日,00 :42:48)?

java - 启动连接 JMS?

java - 向 ThreadPoolExecutor 的 BlockingQueue 添加任务是否可取?

java - 执行者取消未决任务 - 需要帮助

python - 在 Python 3.x 中设计搜索运算符转换器的最佳方法?

python - 将字符串列表解压到另一个字符串列表中

c - 使由函数初始化的变量可用于多线程环境中的函数