如何等待程序直到函数给出 return 值?

How to wait program until the function give return value?

我有这样的代码:

zmq = Zmq_Connector_Mod.DWX_ZeroMQ_Connector()
zmq._GET_HIST_INDICATORS_(_symbol, 'C1')
sleep(random() * 5 )
c1_path = zmq._GET_DATA_()

zmq = Zmq_Connector_Mod.DWX_ZeroMQ_Connector()
zmq._GET_HIST_INDICATORS_(_symbol, 'BASELINE')
sleep(random() * 5 )
baseline_path = zmq._GET_DATA_()

zmq = Zmq_Connector_Mod.DWX_ZeroMQ_Connector()
zmq._GET_HIST_INDICATORS_(_symbol, 'C2')
sleep(random() * 5 )
c2_path = zmq._GET_DATA_()

zmq = Zmq_Connector_Mod.DWX_ZeroMQ_Connector()
zmq._GET_HIST_INDICATORS_(_symbol, 'EXIT')
sleep(random() * 5 )
exit_path = zmq._GET_DATA_()

我在 zmq._GET_DATA_() 为 运行ning 时遇到问题,它没有 returned 值,因为 zmq._GET_HIST_INDICATORS_() 函数需要几秒钟才能 return 值。我已经使用了 sleep(),但效率不高,因为当我尝试在另一台比我的设备慢的设备中 运行 这段代码时,它只是无济于事。如何等待程序从执行 zmq._GET_DATA_() 直到 zmq._GET_HIST_INDICATORS_() 已经 returned 值而不使用需要时间的 sleep(),同时每个设备都有不同的 运行ning 时间执行代码 ?

看起来您正在使用消息队列,因此必须有记录的异步方式来执行此操作,但您可以尝试如下操作:

exit_path = None
while exit_path is None:
    try:
        exit_path = zmq._GET_DATA_()
    except AttributeError:
        exit_path = None
        sleep(1)

这应该每秒检查一次以查看数据是否可用。

Higher-level 概述:通常在异步消息队列中,您可以使用一些模式,这样您就不必一遍又一遍地轮询:

  1. Publish-subscribe
  2. 等待获取
  3. Request-reply
  4. 消息侦听器

  1. 这可以在 ZeroMQ 中实现,例如https://rillabs.org/posts/pub-sub-with-zeromq-in-python and this Whosebug question discusses it in detail: ZeroMQ - Multiple Publishers and Listener

  2. Get with wait是一种为get操作设置超时的模式,在超时之前不会return报错。在典型的 zmq.recv() 调用中,您可以指定超时。

  3. Request-reply 通常在请求者指定回复队列并执行等待操作的情况下实现。使用这意味着您将知道哪个 returned 消息对应于您发送的每条消息。 https://zguide.zeromq.org/docs/chapter3/#Recap-of-Request-Reply-Sockets

  4. 消息侦听器设置响应事件的响应对象,可以通过多种方式实现。各种消息队列技术都有这个built-in,找不到好的zmq例子,但绝对可以实现!


其他排队技术更容易实现这些模式,例如如果您想探索 ActiveMQ、IBM MQ、RabbitMQ。