我试图在python中使用带有两个套接字的ZeroMQ Poller()功能:
import zmq
# Prepare our context and sockets
context = zmq.Context()
receiver = context.socket(zmq.DEALER)
receiver.connect("ipc:///tmp/interface-transducer")
subscriber = context.socket(zmq.SUB)
subscriber.bind("ipc:///tmp/fast-service")
subscriber.setsockopt(zmq.SUBSCRIBE, b"10001")
# Initialize poll set
poller = zmq.Poller()
poller.register(receiver, zmq.POLLIN)
poller.register(subscriber, zmq.POLLIN)
# Process messages from both sockets
while True:
try:
socks = dict(poller.poll())
except KeyboardInterrupt:
break
if receiver in socks:
message = receiver.recv()
print("RECEIVER OK\n")
if subscriber in socks:
message = subscriber.recv()
print("SUBSCRIBER OK\n")然后,将消息发送为ROUTER的服务器描述为:
def main():
context = zmq.Context()
router = context.socket(zmq.ROUTER)
router.bind("ipc:///tmp/interface-transducer")
while True:
identity = b'electrode-service'
b_identity = identity
router.send_multipart([b_identity, b'[1,2]'])
print("Sent")
time.sleep(1)
if __name__ == "__main__":
main()但是,当我运行这两个进程时,它不像预期的那样工作,轮询脚本不会打印任何内容。这样的执行会有什么问题?
发布于 2020-10-31 16:01:16
Q:“这样的实现会有什么问题?”
.poll() & .recv()方法的阻塞形式而失败。
的情况下,是不够自卫的。
.recv()的情况下,如果.send_multipart()发出了惊人的警告,那么就会出现多部分的消息处理所需的。
ipc://传输类容易隐藏与O/S相关的用户级代码限制(由操作系统设置在路径名的格式和长度以及对R/W/X的有效用户权限)。
ipc://传输类.connect()-方法的使用取决于目标地址尚未由O/S服务创建的情况(首先需要成功的.bind() ).bind()放到同一个ipc://传输类目标上的任何尝试都将悄悄地将您预定的ROUTER-access摧毁到消息/信令平面基础结构&您的实现已经花费了零的努力来自我保护和自我诊断错误,这些错误可能会悄悄地出现在“窗帘后面”上。
不应该自动处理死锁吗?如果不能同时使用.poll()和recv(),应该如何使用ZMQ结构?- hao123
No
ZeroMQ zen- of -0是以性能+低延迟为重点的,因此请考虑对阻塞预防的所有适当的注意应该掌握在您自己的手中(根据需要&在需要的地方,为了实现几乎线性的可伸缩性能的目标,核心库永远不会比需要的步骤多一个步骤)。
No,
自由使用.poll()-和.recv()-methods,但完成它以适应非阻塞方式--.poll()& add活动检测+多部分消息的处理(同样,最好使用非阻塞方式,在适当的情况下使用zmq.NOBLOCK选项标志)。自我阻塞会使代码失控。
https://stackoverflow.com/questions/64608767
复制相似问题