基本上我有这样的问题:
我使用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
还有其他方法吗?在
停止线程的最佳方法是发送一个关闭消息,创建一个
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:根据经验,可以使用几个附加的}模式,这些模式添加到任何线程代码单元的核心逻辑中。这有助于测试和任何类型的内部设置中的特殊更改(有效地将分布式
SIG
和DIAG
消息传递{CLI
接口添加到代码单元是很酷的副产品,不是吗?)和/或螺纹终止。在当然有。每当人们觉得
REQ/REP
正式的通信模式是正确的,请再次检查这本书并重新设计代码,这样它就可以在REQ/REP
无法从不同步的分布式-FSA
步进中幸存下来。许多帖子都提到这一主要问题。在尾声:强烈建议在线程中共享ZeroMQ套接字实例。在
相关问题 更多 >
编程相关推荐