zmq 订阅模式如何关闭
zmq 在网上有很多例子,但都没讲如何关闭订阅模式下的连接。往往线程会阻塞在 socket.recv_string() 函数中。
解决思路:1 首先可以根据接受到的字符串来做一个判断条件来退出循环。这点是没问题的。
但如何向一个订阅者发送字符串,尤其是发布方状态未知的情况下,好在订阅模式可以订阅两个连接,这样就可以订阅一个专门的连接来控制监听了。
代码如下。
点击查看代码
import sys
import zmq
import time
import datetime
import threading
class x_send():
def __init__(self):
self.c1= zmq.Context()
self.s1=self.c1.socket(zmq.PUB)
self.s1.bind('tcp://127.0.0.1:52557') # 专门用来自我关闭的发布方
self.t1=None
def run(self):
self.t1=threading.Thread(target=self.get_data,args=())
self.t1.Daemon=True
self.t1.start()
def get_data(self):
self.c2= zmq.Context()
self.s2=self.c2.socket(zmq.SUB)
self.s2.setsockopt_string(zmq.SUBSCRIBE,"") #这个一定要写,不然不接受
self.s2.connect('tcp://127.0.0.1:52556') #订阅 连接其他发布方的数据
self.s2.connect('tcp://127.0.0.1:52557')
print('开始接受',self.s2)
while True:
string=self.s2.recv_string()
print(string)
if string=='close':
break
def send_data(self,string):
print('发送=',string)
self.s1.send_string(string)
def close(self):
self.s1.close()
self.c1.term()
print('关闭')
if self.t1:
self.t1.join()
self.t1=None
self.s2.close()
self.c2.term()
test1=x_send()
time.sleep(0.2)
test1.run()
time.sleep(0.2)
test1.send_data('aaaa')
time.sleep(2)
test1.send_data('close')
time.sleep(1)
test1.close()

浙公网安备 33010602011771号