Python 我是否需要为ZMQ上的每个订阅创建新套接字?

Python 我是否需要为ZMQ上的每个订阅创建新套接字?,python,sockets,asynchronous,zeromq,distributed-computing,Python,Sockets,Asynchronous,Zeromq,Distributed Computing,服务器在对象列表中循环,这些对象上的数据会实时更改。服务器每毫秒发布这些对象的所有新数据。 i、 e.[“胡萝卜”、“香蕉”、“芒果”、“茄子”] 客户机可以通过其名称订阅特定对象self.sub_socket.setsockopt_字符串(zmq.SUBSCRIBE,'Carrot') 在线程上,客户端也会实时轮询这些数据 为True时: sockets=dict(self.poller.poll(poll\u超时)) 如果插座中的self.sub_插座和插座[self.sub_插座]==zm

服务器在对象列表中循环,这些对象上的数据会实时更改。服务器每毫秒发布这些对象的所有新数据。 i、 e.
[“胡萝卜”、“香蕉”、“芒果”、“茄子”]

客户机可以通过其名称订阅特定对象<代码>self.sub_socket.setsockopt_字符串(zmq.SUBSCRIBE,'Carrot')
在线程上,客户端也会实时轮询这些数据

为True时:
sockets=dict(self.poller.poll(poll\u超时))
如果插座中的self.sub_插座和插座[self.sub_插座]==zmq.POLLIN:
msg=self.sub_socket.recv_字符串(zmq.DONTWAIT)
//用味精做点什么。。。
问题是当我订阅多个对象时,比如说,
胡萝卜、茄子和香蕉
。我只是 接受来自
胡萝卜
、有时来自
香蕉
、茄子等的变化。我认为这是因为从服务器的循环顺序来看,比如当客户端轮询时,接收胡萝卜,处理数据,然后再次轮询,但是服务器已经完成了通过列表的发布,只是再次发布胡萝卜,然后客户端轮询只接收胡萝卜

所以我想为每个订阅创建单独的套接字?这是解决办法吗?我是ZMQ的新手,希望能在这里得到帮助,谢谢

Q:“这是一个解决方案吗?”。。。是否为每个订阅创建单独的套接字

没有。除非是出于我不知道的其他原因


如果你从未与之合作过,
在这里,你可以先看看
,然后再深入了解更多细节


虽然ZeroMQ消息传递基础结构为每个消息传递提供零担保,但这并不意味着消息在发送后会蒸发或丢失。它只是说,期望每一个交付的产品都能享受零保修,如果需要,可以增加想要的保修机制管理费用,其他人如果可以不使用这些机制就不需要支付费用。失去1:1.000.000?1比1.000.000.000?这取决于许多因素,但丢失消息并不是系统的常见或随机状态(并且有一些内部原因,其细节超出了本文的范围)


还在怀疑吗? 做个测试

设计一个简单的测试-
PUB
端发送均匀分布的琐碎消息

SAMPLEs  = int( 1E6 )
aMsgSIZE = 2048
TOPICs   = [ r'Carrot', r'Banana', r'Mango', r'Eggplant', r'' ]
MASK     = "{0:}" + aMsgSIZE * "_"

for i in range( SAMPLEs ):
    PUB.send( MASK.format( TOPICs[np.random.randint( len( TOPICs ) - 1 ) ) )
    time.sleep( 1E-3 )
使用此测试,您将收到均匀分布的样本,每个订阅的
主题的数量相同(如果全部订阅)

增加
aMsgSIZE
可能会(在默认的
Context()
-和
Socket()
-实例下)创建一些消息以“丢失”,但同样,这应该是均匀分布的。如果没有,深入挖掘会有一些麻烦

示例
发送的消息量将显示调整
上下文()
套接字()
-实例参数的需要有多大,以便提供足够的资源来安全地将数据流排队。但是,为单个订阅的主题字符串提供更多的
Socket()
-s将无法解决此资源管理瓶颈(如果存在)

如果均匀分布的主题组合有或没有扭曲,以及最后没有收到多大的分数,请毫不犹豫地公布测试结果


添加平台详细信息+ZeroMQ版本,所有这些都很重要,一如往常:o)

成功了,服务器是用不同的语言编写的。客户端写在python pyzmq v0.19上,然后服务器写在MQ4上。在一分钟的测试中,我得到了主题分布的点击率。谢谢!