如何停止正在等待客户端.connect()的线程?

2024-04-19 21:18:13 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上我有这样的问题:

我使用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:当我想退出程序时,如何停止此线程?
因为当我想退出程序时,程序“挂起”,因为线程仍在运行并等待客户端。
Q2:您认为如何实现这一点是最好的?
Q3:除了REQ/REP还有其他方法吗?在


Tags: 数据self程序服务器client客户机connectservice
2条回答

停止线程的最佳方法是发送一个关闭消息,创建一个shutdown属性,用一个boolean false值初始化,然后将其设置为运行服务器的条件(在while循环中,设置while !shutdown:),那么一旦服务器从客户端接收到关闭请求,您将用true修改shutdown属性的值,它将停止while循环,然后关闭线程。在

ZeroMQ是一套非常强大的工具,用于智能分布式应用程序,它具有消息传递和信令功能,可以“刚使用”(如果知道如何使用的话,do not hesitate to follow the book)。在


A1:首先,您需要以非阻塞、异步模式开始设计代码单元,这样您仍然可以独立于任何内部/外部阻止程序来控制线程代码。作为第1课,我们必须忘记仅仅使用裸的.recv()并在必要时从精神上转换到zmq.NOBLOCK和/或循环控制.poll( nMSECs )(并非所有的ZeroMQ包装都有pyzmq那样的舒适感,所以一定要从中受益)。在


A2:根据经验,可以使用几个附加的SIGDIAG消息传递{}模式,这些模式添加到任何线程代码单元的核心逻辑中。这有助于测试和任何类型的内部设置中的特殊更改(有效地将分布式CLI接口添加到代码单元是很酷的副产品,不是吗?)和/或螺纹终止。在


当然有。每当人们觉得REQ/REP正式的通信模式是正确的,请再次检查这本书并重新设计代码,这样它就可以在REQ/REP无法从不同步的分布式-FSA步进中幸存下来。许多帖子都提到这一主要问题。在


尾声:强烈建议在线程中共享ZeroMQ套接字实例。在

相关问题 更多 >