【问题标题】:How to share data between python processes without writing to disk如何在不写入磁盘的情况下在 python 进程之间共享数据
【发布时间】:2011-01-01 16:09:50
【问题描述】:

你好, 我想在 python 和进程之间共享少量数据(

  • 这是一个有效的担忧吗?我们可以将 CF 卡换成 SSD。
  • 使用 mmap 更改值是将数据物理写入磁盘还是虚拟文件?
  • 我们将在 Debian 上运行,因此 Python 模块的 POSIX IPC 可能是最好的解决方案。有人用过吗?
  • 有人试过Python Object Sharing (POSH) 模块吗?乍一看,它看起来很有希望,但它仍处于“Alpha”阶段,似乎并未积极开发。

谢谢

更新: 我们将最大数据更新速率降低到大约 10 Hz,但更常见的是 1 Hz。仅当值更改而不是恒定更新速率时才会通知客户端。 我们已经进入了多服务器/多客户端模型,其中每个服务器专门处理某种类型的仪器或功能。 由于事实证明大部分编程将由 Java 程序员完成,我们最终使用 JSON-RPC over TCP。服务器将用 Java 编写,但我仍然希望用 Python 编写主客户端,并且正在研究 JSON-RPC 实现。

【问题讨论】:

  • +1 用于 python + 太阳能。太棒了。
  • 您能否评论一下数据更改的频率以及消费者需要多久更新一次?这些信息将有助于选择最佳方法。
  • 有些数据值可能每秒变化两次,而有些变化很少。看起来其他一些进程可能是 Java,所以套接字方法看起来最好。我想我会尝试做一些事情,让客户端(消费者)注册它对某个值(例如电机电流、开关状态、风速等)的兴趣,并且只要值发生变化,服务器就会向客户端发送更新。客户端还可以请求数字输出的状态更改。

标签: python ipc mmap json-rpc pc104


【解决方案1】:

在服务器进程中将数据写入文件的另一种方法可能是直接写入客户端进程:

使用 UNIX 域套接字(如果客户端在不同机器上运行,则使用 TCP/IP 套接字)将每个客户端连接到服务器,并让服务器写入这些套接字。根据您的特定处理模型,选择客户端/套接字可能由服务器完成(例如循环)或由客户端发出信号表示他们已准备好进行更多操作。

【讨论】:

  • 这就是我的想法(UD 或 TCP 套接字)。甚至只是在 unix 上创建一个 FIFO。
【解决方案2】:

在闪存系统上运行时,请确保您的文件系统设计正确,以最大限度地延长闪存的使用寿命(损耗均衡)。 JFFS 并且我相信其他人现在能够有效地做到这一点。如果您使用这样的系统,则不必过分担心使用闪存,但如果您正在写入恒定的数据流,您肯定希望避免在闪存上这样做。

使用 RAM 文件系统是个好主意。如果系统设计允许,最好完全避免使用文件系统。为此,您提到了POSH。我从未尝试过,但我们发现 Pyro ("PYthon Remote Objects") 在某些类似情况下是一种优雅而有效的解决方案。

当然还有标准库multiprocessing 模块,它在进程之间的通信方式方面有一些相似之处。我会从那里开始这个领域的任何新发展,只有在没有成功的情况下才会去其他地方。

【讨论】:

    【解决方案3】:

    根据Wikipedia article about the mmap system call,内存映射文件内容在更新时写回磁盘

    您是否查看过多处理模块(在标准库中)——尤其是进程之间的共享状态部分?

    Piskvor 提到的 Ramfs 似乎也是一个不错的解决方案 - 尤其是当并非所有进程都用 Python 编写时。

    【讨论】:

      【解决方案4】:

      创建一个 ramfs 分区并写入该分区。 (您可以使用 tmpfs,但与 tmpfs 不同,ramfs 不会交换到磁盘)。但是,由于 ramfs 没有大小限制,因此您必须注意不要耗尽内存;因为你只在那里写了一点点数据,所以这应该不是问题。

      这样,您的数据将永远不会写入磁盘(注意:如果断电,您将丢失它们)。

      See also the ramfs docs.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-16
        • 2020-08-06
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多