Python ZeroMQ:每个数据类型的套接字还是仅一个套接字?
我有一个程序,它从大约10个其他(传感器读取)程序(全部由我自己控制)接收信息。我现在想让他们用英语交流。Python ZeroMQ:每个数据类型的套接字还是仅一个套接字?,python,linux,sockets,zeromq,Python,Linux,Sockets,Zeromq,我有一个程序,它从大约10个其他(传感器读取)程序(全部由我自己控制)接收信息。我现在想让他们用英语交流。 对于大多数队列,重要的是中央接收程序始终具有最新的传感器数据,所有旧消息不再重要。如果有几条信息丢失了,我不在乎。因此,对于所有人,我从一个单独的发布/订阅套接字开始;每个程序一个。但我不确定这样做是否正确。据我所知,我有两个选择: 为每个程序制作一个单独的套接字,并在循环中读取它们。这样,我就可以通过套接字知道我正在接收什么信息(我通常只是发送一个int) 制作一个所有程序都连接的套接字
对于大多数队列,重要的是中央接收程序始终具有最新的传感器数据,所有旧消息不再重要。如果有几条信息丢失了,我不在乎。因此,对于所有人,我从一个单独的
发布/订阅套接字开始;每个程序一个。但我不确定这样做是否正确。据我所知,我有两个选择:
为每个程序制作一个单独的套接字,并在循环中读取它们。这样,我就可以通过套接字知道我正在接收什么信息(我通常只是发送一个int
)
制作一个所有程序都连接的套接字,我会在每条消息中发送一个字符串
,告诉接收端消息的内容
所有连接都是基于发布/订阅的,因此创建一个套接字很好。我只是不确定这是不是最有效的方法
欢迎所有提示 除非您面临严格的实时要求,否则没有必要使用更多的套接字。ZMQ的公平队列应该注意给予每个传感器程序同等的关注(参见中的图6)
如果传感器程序位于通过以太网连接的其他设备上,则程序的最终性能受计算机中以太网NIC带宽的限制。一个单线程程序处理一个拉式套接字,很有可能比传输NIC更快地处理传入的数据
如果是这样的话,那么您可以坚持使用单个套接字并享受更简单的代码。处理多个套接字并不困难,但处理一个套接字要容易得多。例如,使用一个插座,您不必告诉每个传感器程序要连接到哪个网络端口,它可以是一个常量
推/拉听起来比酒吧/酒吧更适合你的情况,但这没什么区别
持久性
持久性将是你(潜在)的问题。像ZMQ这样的东西的全部意义在于,它们将按照发送的顺序发送消息。因此,你阅读了一封邮件,根据定义,它是收件人关注的“最后一封”邮件。收件人不知道途中是否有另一封邮件,也不知道是否正在传输中
这是Actor模型体系结构(ZMQ就是这样)的一个特性。消息在传输过程中得到缓冲,在读取消息时,没有关于消息新性的信息可供了解。你所知道的只是它是提前一段时间发出的。没有与发送方的执行集合
现在,您要么像处理最后一条消息一样处理它,要么在处理它之前等待一段时间,看看是否有另一条消息出现。最简单的方法是简单地处理每条消息,就像它是最后一条一样
这与通信顺序过程体系结构形成对比。它基本上与Actor模型体系结构相同,只是传输不缓冲消息。邮件发送阻止,直到收件人调用邮件读取
因此,当您阅读邮件时,收件人知道它是发件人最后发送的邮件。而且发送者知道它发送的消息已经被接收者在那个瞬间接收到了。因此,对最新性的认识是绝对的——收到的信息实际上是最后发送的信息
然而,除非你有一些相当重要的事情发生,否则我不会担心。即使您正在读取的消息不是队列中的最新消息,您也很可能能够跟上传感器数据流
通过将发送端插座上的高水位限制设置为1,几乎可以将ZMQ设置为CSP。这意味着您最多可以缓冲1条消息。这与0不同,不幸的是,将HWM设置为0意味着“无限大小的缓冲区”
-PUB/SUB
很好,可以轻松地从N-sensors:1-logger转换为N-sensors:2+-logger
-一个插座与一个接入端口的概念分离也会带来好处,在这里可以连接多个插座
如何始终仅获取实际(最后)传感器读数:
如果由于系统集成的限制,没有绑定到一些早期的ZeroMQ API,那么通过一个.setsockopt(ZMQ_CONFLATE,True)
方法,就有了一个非常好的特性:
ZMQ\u CONFLATE
:只保留最后一条消息
如果设置,套接字应在其入站/出站队列中仅保留一条消息,该消息是最后接收的消息/最后发送的消息。
忽略ZMQ\u RCVHWM
和ZMQ\u SNDHWM
选项。不支持多部分消息,特别是套接字内部队列中只保留一部分消息
关于设计困境:
除非您的实时控制稳定性引入了一些硬实时限制,PUB
-端自由决定指示新值的频率.send()
到子
(.s)。这里不需要魔法,在管理的内部传出队列上设置了ZMQ\u CONFLATE
选项
(-s)侧接收器也将受益于内部传入队列管理上设置的ZMQ\u CONFLATE
选项,但给定一组单独的。bind()
-s实例化单独的着陆端口,以交付不同的单独传感器读数,即“最后一个”值将始终保持为“最后”读数。如果所有读数都是整数