在 Python、Windows 中跨进程发送带有 ID 的图像

问题描述 投票:0回答:1

我在同一台计算机上有一个包含多个 Python 进程的项目。

Python进程A是中心节点,它接收来自传感器的图像和数据。

Python 进程 A 将图像发送给进程 B 进行图像处理/特征检测,进程 B 将一些信息返回给进程 A。系统比这复杂得多,这就是为什么它首先被分开。

我想实现的一个想法是用整数标记图像,比方说

x
。这样,进程 B 可以说“嗨,进程 A,这是图像
x
的数据”。

问题是,如何优雅快速地跨进程发送图像和这个整数?

想法:

  • 使用 MQTT 或 ZeroMQ 进行通信。将图像转换为字符串,将其放入带有 id 的字典中,然后发送。我认为这些会很慢,因为我们正在序列化大量图像并通过这些块状协议发送大量数据。
  • 使用共享内存分享图像。我已经对此进行了原型设计,发送图像非常快,但是对整数进行编码并不优雅。我可能会将整数编码为角落中几个像素的 RGB 值,但这感觉很糟糕。
  • Pickling 可能比字符串序列化更好,因为它的字节与字符串相比更快? 多处理管道和队列似乎是为此目的,但发送方和接收方似乎需要在同一个 Python 线程中启动。
  • 在每个过程中为每个图像找到一个唯一的哈希值。我现在倾向于这个选项,它很容易理解,但可能不是最快的。

我认识到这是一个架构问题,这些问题不受欢迎,但我觉得必须有一个更优雅的解决方案,我认为这是一个有趣的设计问题。

python shared-memory
1个回答
0
投票

就我个人而言,我发现 Redis 非常适合这种类型的东西。把它想象成一个超快的“内存中”数据结构服务器,可以提供原子整数、字符串、图像、列表、队列、集合、排序集合、JSON、流、PUB/SUB ...这里是创建/读取对象的命令。

它具有 C、C++、Python、Ruby、PHP 和

bash
命令行的绑定,因此您可以轻松地从 shell 注入和检查测试数据。

而且它完全分布在网络中。

它可以处理二进制数据(无需序列化)以及最大 512MB 的键和值。

因此,您可以创建一个包含 JPEG/PNG/TIFF 或二进制数据 (SET) 原始图像的 Redis 对象,然后推送 (LPUSH) 包含对象名称和

id
的 JSON 到队列中处理。

根据需要运行尽可能多的处理节点

pops
关闭队列 (BRPOP),并通过添加更多来扩展。

有另一个

results
队列,工作人员将另一个 JSON 与他们的答案和相应的
id
.

您还可以指定一个“生存时间”,以便在给定时间后自动删除数据结构。

如果需要,您还可以在重新启动后创建持久性。

如果你想集群它,你也可以添加冗余。

我做了很多例子,尝试搜索我的用户名和

Redis
image
。希望 this 会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.