VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 46
声望: 0

zmq服务器端用zmq.NOBLOCK非阻塞模式接收数据时,接收不到数据,但是在阻塞模式下能接收到数据,请问是怎么回事儿?我需要用到非阻塞模式来设置定时器。

Member
avatar
加入于:
帖子: 1492
声望: 106

贴个代码看下?

Member
avatar
加入于:
帖子: 46
声望: 0

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()
Member
avatar
加入于:
帖子: 1492
声望: 106

NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取

Member
avatar
加入于:
帖子: 46
声望: 0

MTF wrote:

NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取

用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。

Member
avatar
加入于:
帖子: 125
声望: 4

曲18596122723 wrote:

MTF wrote:

NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取

用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。
检查一下回调函数有没有被调用

Member
avatar
加入于:
帖子: 46
声望: 0

七月雪 wrote:

曲18596122723 wrote:

MTF wrote:

NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取

用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。
检查一下回调函数有没有被调用

有被调用

Member
avatar
加入于:
帖子: 1492
声望: 106

曲18596122723 wrote:

MTF wrote:

NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取

用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。

你这里定时调用的get_trade_info,包含了持续创建context、发起socket连接、获取数据等多步操作,如果只是为了获取数据,那么前面两步都应该挪到外部初始化的地方。

Member
avatar
加入于:
帖子: 46
声望: 0

MTF wrote:

曲18596122723 wrote:

MTF wrote:

NOBLOCK的意思是,如果当前没有数据就立即返回,所以要通过死循环的方式不断获取

用的定时器,每1ms轮询一次,不就相当于死循环吗?关键是一直接收不到数据,客户端已经发送数据了,但是这边还是一直接收不到数据。

你这里定时调用的get_trade_info,包含了持续创建context、发起socket连接、获取数据等多步操作,如果只是为了获取数据,那么前面两步都应该挪到外部初始化的地方。

还是接收不到数据

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】