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()
posted @ 2024-08-09 21:36  远方_2408  阅读(33)  评论(0)    收藏  举报