基本上我有这个问题:
我使用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
之外还有其他方式吗?
答案 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套接字实例。