【问题标题】:Share a resource between two processes在两个进程之间共享资源
【发布时间】:2011-06-02 07:24:03
【问题描述】:

我想了解在 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 对象(缺点:不确定如何将其编码为一个进程是一个守护进程)

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

【问题讨论】:

    标签: python producer-consumer shared-resource


    【解决方案1】:

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

    请注意,这假设生产者派生出消费者(反之亦然) - 如果消费者是一个可以处理多个相对短命的生产者的长期运行的守护进程,那么情况会变得相当困难 - 没有' t,据我所知,任何跨平台的高级 IPC 模块;处理此问题的最便携(通常也是最简单)的方法可能是将文件系统用作队列 - 在某处有一个 spool 文件夹,生产者为每个请求写入一个文本文件;然后消费者可以在闲暇时处理这些 - 但是,这并非没有自己的问题:您需要确保消费者不会尝试打开半写的指令文件,生产者不会踩到彼此的脚趾,并且生产者和消费者就请求的顺序达成一致。

    【讨论】:

    • lvc: 谢谢你的建议。没有一个进程会产生另一个进程。它们是独立创建的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2010-12-18
    • 2012-04-07
    相关资源
    最近更新 更多