如何停止等待Client到.connect()的线程?

时间:2016-06-29 14:24:09

标签: python thread-safety zeromq pyzmq xbmc

基本上我有这个问题:

我使用ZMQ使用 PUB/SUB 正式模式将一些数据发布到其他程序。第一类,即服务器等待客户端.connect(),当客户端连接时,服务器将数据发送给客户端。

我使用ZMQ REQ/REP来同步服务器和客户端。

这是 Server.py

class PublishThread (threading.Thread):
def __init__(self):
    threading.Thread.__init__(self)
    socketPub.bind("tcp://127.0.0.1:4002")
    syncservice.bind('tcp://127.0.0.1:5001')
def run(self):
    while True:
        subscribers = 0
        topic = b"PHONEBOOK"
        while subscribers < 1:
            # Here we wait for client to connect. If the client doesn't 
            #connect, this is where this thread will "hang"
            syncservice.recv()
            # Send response to client
            syncservice.send(b'')
            subscribers += 1

        socketPub.send_multipart([topic, data1])
        subscribers = 0

Q1:当我想要退出程序时,如何停止此线程?
因为当我想退出程序时,程序&#34;挂起&#34;因为线程仍在运行并等待客户端 Q2:您如何看待最佳实施方案? 问题3: REQ/REP 之外还有其他方式吗?

2 个答案:

答案 0 :(得分:0)

停止线程的最佳方法是发送关闭消息,创建shutdown属性,使用布尔值false初始化,然后将其设置为运行服务器的条件(在{{1}中} loop,设置 while )然后,一旦您的服务器收到来自客户端的关闭请求,您将使用true修改shutdown属性的值,这将停止while循环,然后关闭您的线程

答案 1 :(得分:0)

ZeroMQ是一套非常强大的智能分布式应用工具,具有消息和信令功能,随时可以“使用”(如果有人知道 - 无论如何,do not hesitate to follow the book)。

A1:首先,您需要以非阻塞的异步模式开始设计代码单元,这样您仍然可以独立于任何内部/外部阻止程序控制线程代码。作为第1课,人们不得不忘记使用裸体 .recv() 并在心理上切换到 zmq.NOBLOCK 和/或循环控制必要时 .poll( nMSECs ) (并非所有ZeroMQ包装都有pyzmq所带来的舒适感,所以也可以从此奖金中获益。

A2:作为经验法则,可以使用其他几个 SIG DIAG messaging ZeroMQ - 模式添加到任何线程代码单元的核心逻辑。这有助于您在任何类型的内部设置中进行测试和临时更改(有效地为您的代码单元添加分布式 CLI 接口是很酷的副产品,isn'是吗?)和/或终止线程。

A3: 确定有。每当有人感觉REQ/REP正式沟通模式是正确的时候,请再次检查书籍并重新设计代码,以便它能够在REQ/REP无法使自己脱离同步分布 - FSA - 一旦它静默地陷入去同步状态,就会步履蹒跚。很多帖子都提到了这个主要问题。

结语:强烈建议不要在线程中共享ZeroMQ套接字实例。