Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ZeroMQ:每个数据类型的套接字还是仅一个套接字?_Python_Linux_Sockets_Zeromq - Fatal编程技术网

Python ZeroMQ:每个数据类型的套接字还是仅一个套接字?

Python ZeroMQ:每个数据类型的套接字还是仅一个套接字?,python,linux,sockets,zeromq,Python,Linux,Sockets,Zeromq,我有一个程序,它从大约10个其他(传感器读取)程序(全部由我自己控制)接收信息。我现在想让他们用英语交流。 对于大多数队列,重要的是中央接收程序始终具有最新的传感器数据,所有旧消息不再重要。如果有几条信息丢失了,我不在乎。因此,对于所有人,我从一个单独的发布/订阅套接字开始;每个程序一个。但我不确定这样做是否正确。据我所知,我有两个选择: 为每个程序制作一个单独的套接字,并在循环中读取它们。这样,我就可以通过套接字知道我正在接收什么信息(我通常只是发送一个int) 制作一个所有程序都连接的套接字

我有一个程序,它从大约10个其他(传感器读取)程序(全部由我自己控制)接收信息。我现在想让他们用英语交流。

对于大多数队列,重要的是中央接收程序始终具有最新的传感器数据,所有旧消息不再重要。如果有几条信息丢失了,我不在乎。因此,对于所有人,我从一个单独的
发布/订阅
套接字开始;每个程序一个。但我不确定这样做是否正确。据我所知,我有两个选择:

  • 为每个程序制作一个单独的套接字,并在循环中读取它们。这样,我就可以通过套接字知道我正在接收什么信息(我通常只是发送一个
    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实例化单独的着陆端口,以交付不同的单独传感器读数,即“最后一个”值将始终保持为“最后”读数。如果所有读数都是整数