如何等待程序直到函数给出 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 概述:通常在异步消息队列中,您可以使用一些模式,这样您就不必一遍又一遍地轮询:
- Publish-subscribe
- 等待获取
- Request-reply
- 消息侦听器
这可以在 ZeroMQ 中实现,例如https://rillabs.org/posts/pub-sub-with-zeromq-in-python and this Whosebug question discusses it in detail: ZeroMQ - Multiple Publishers and Listener
Get with wait是一种为get操作设置超时的模式,在超时之前不会return报错。在典型的 zmq.recv()
调用中,您可以指定超时。
Request-reply 通常在请求者指定回复队列并执行等待操作的情况下实现。使用这意味着您将知道哪个 returned 消息对应于您发送的每条消息。 https://zguide.zeromq.org/docs/chapter3/#Recap-of-Request-Reply-Sockets
消息侦听器设置响应事件的响应对象,可以通过多种方式实现。各种消息队列技术都有这个built-in,找不到好的zmq例子,但绝对可以实现!
其他排队技术更容易实现这些模式,例如如果您想探索 ActiveMQ、IBM MQ、RabbitMQ。
我有这样的代码:
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 概述:通常在异步消息队列中,您可以使用一些模式,这样您就不必一遍又一遍地轮询:
- Publish-subscribe
- 等待获取
- Request-reply
- 消息侦听器
这可以在 ZeroMQ 中实现,例如https://rillabs.org/posts/pub-sub-with-zeromq-in-python and this Whosebug question discusses it in detail: ZeroMQ - Multiple Publishers and Listener
Get with wait是一种为get操作设置超时的模式,在超时之前不会return报错。在典型的
zmq.recv()
调用中,您可以指定超时。Request-reply 通常在请求者指定回复队列并执行等待操作的情况下实现。使用这意味着您将知道哪个 returned 消息对应于您发送的每条消息。 https://zguide.zeromq.org/docs/chapter3/#Recap-of-Request-Reply-Sockets
消息侦听器设置响应事件的响应对象,可以通过多种方式实现。各种消息队列技术都有这个built-in,找不到好的zmq例子,但绝对可以实现!
其他排队技术更容易实现这些模式,例如如果您想探索 ActiveMQ、IBM MQ、RabbitMQ。