由于我的工作原因,我使用zmq REQ / REP模式,决定在与主体不同的线程中进行服务器的转发器工作。我要显示的代码总结了这种方法: 为True时: 我修改了pyzmq指南的hello world示例。所以,我的问题是,当我从Pieter Hintjens编写的文档运行hello world客户程序时,预期的行为是:对于我创建的每个线程,我打开的replier套接字将答案发送给客户程序,但是真正的行为是,在第一个线程之后,连接块的两侧。如果我在客户端进行轮询,然后重试发送,则成功,但这不是我想要的。是否有可能在服务器端的新线程中获得成功? 答案 0 :(得分:0) Q :是否有可能在服务器端的新线程中成功接收? 是的。 您的一半代码(客户端仍然不可见)效率很低。创建+设置+自建 distributed-computing 基础结构需要花费一些时间(重新实例化 好吧,如果有人愿意。 智能系统可以重复使用资源,而无需为已经支付的费用支付两次(次数更少)。 此外,您的无限循环“重新设置”线程还具有其他从代码中看不到的副作用。除了上面概述的所有系统延迟(但每个呼叫都已重复)之外,还有一个(可能永远永久)阻止延迟- ZeroMQ API的早期版本使用默认的 无论如何,专业的 distributed-computing 设计显式地控制实例参数并出于安全目的始终(无一例外)设置 如果感兴趣,请随时阅读有关许多其他ZeroMQ posts import time
import zmq
import threading
def make_work(context):
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
message = socket.recv()
print("Received request: %s" % message)
#Do some 'work'
time.sleep(1)
#Send reply back to client
socket.send(b"World")
socket.close()
context = zmq.Context()
thr = None
if not thr or not thr.is_alive():
thr = threading.Thread(target = make_work, args= (context, ))
thr.start()`
1 个答案:
Socket
实例,配置其本地端,要求操作系统提供.bind()
的端口,等待其他人成功检测到.connect()
的新对手,并实际上进行.connect()
来建立并协商那里的链接,...), 除了一条消息和.close()
以外的所有工作?
zmq.LINGER
-一个秘密阻止程序。zmq.LINGER == -1
-能够在 .close()
方法上无限地阻塞。肯定是v4.3稳定的最新版本,使用zmq.LINGER
的默认值1000 [ms]
。.setsockopt( zmq.LINGER, 0 )
。REQ/REP
相互僵局的其他无声危险的详细信息