zmq服务器端用zmq.NOBLOCK非阻塞模式接收数据时,接收不到数据,但是在阻塞模式下能接收到数据,请问是怎么回事儿?我需要用到非阻塞模式来设置定时器。
zmq服务器端用zmq.NOBLOCK非阻塞模式接收数据时,接收不到数据,但是在阻塞模式下能接收到数据,请问是怎么回事儿?我需要用到非阻塞模式来设置定时器。
贴个代码看下?
MTF wrote:
贴个代码看下?
def __init__(self, main_engine: MainEngine, event_engine: EventEngine) -> None:
""""""
super().__init__()
self.main_engine: MainEngine = main_engine
self.event_engine: EventEngine = event_engine
self.vt_symbol: str = ""
self.price_digits: int = 0
self.init_ui()
self.register_event()
self.timer_start()
# 启动定时器 时间间隔秒
def timer_start(self):
self.timer_huifang = QtCore.QTimer(self)
self.timer_huifang.timeout.connect(self.get_trade_info)
self.timer_huifang.start(100)
def get_trade_info(self):
# 两个账号交互
context = zmq.Context()
self.socket = context.socket(zmq.REP)
self.socket.connect('tcp://127.0.0.1:8000')
try:
message = self.socket.recv(zmq.NOBLOCK).decode('utf-8') # zmq.DONTWAIT
print("receive success")
print(message)
self.socket.send("hello-server".encode('utf-8'))
print("send success")
except zmq.ZMQError:
message = None
print("没接收到信息")
self.socket.close()
NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取
MTF wrote:
NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取
用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。
曲18596122723 wrote:
MTF wrote:
NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取
用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。
检查一下回调函数有没有被调用
七月雪 wrote:
曲18596122723 wrote:
MTF wrote:
NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取
用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。
检查一下回调函数有没有被调用
有被调用
曲18596122723 wrote:
MTF wrote:
NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取
用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。
你这里定时调用的get_trade_info,包含了持续创建context、发起socket连接、获取数据等多步操作,如果只是为了获取数据,那么前面两步都应该挪到外部初始化的地方。
MTF wrote:
曲18596122723 wrote:
MTF wrote:
NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取
用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。
你这里定时调用的get_trade_info,包含了持续创建context、发起socket连接、获取数据等多步操作,如果只是为了获取数据,那么前面两步都应该挪到外部初始化的地方。
还是接收不到数据