我试图运行协程,并等待eventloop.run_until_complete
的返回值,但是我注意到run_until_complete
在协程基本完成之后会返回很多时间(最终会返回)。
这是我尝试过的代码片段:
def wait_for_message(timeout_sec):
loop = asyncio.get_event_loop()
fut = asyncio.ensure_future(_receive_pb_msgs(timeout_sec))
res = loop.run_until_complete(fut)
return res
async def _receive_msgs(timeout_sec):
start_time = time()
current_time = start_time
text = None
async with wsc.connect("URL") as ws:
while current_time - start_time <= timeout_sec:
jdata = await ws.recv()
msg = json.loads(jdata)
if some_criteria:
text = msg
break
current_time = time()
await sleep(.1)
print(f"return: {current_time - start_time}")
return text
if __name__ == "__main__":
s = time()
msg = wait_for_message(10)
e = time()
print(f"actual: {e - s})
和输出:
return: 6.387637138366699
actual: 38.61859059333801
您可以看到,即使函数在6秒钟后完成,循环仍需要38秒钟才能完成。
这里有什么我想念的吗? 谢谢!
答案 0 :(得分:2)
break
上的some_criteria
将使current_time
过时(因为将不考虑当前迭代)async with
后,可能会发生current_time
退出清理工作您绝对应该在打印current_time = time()
之前放置行return:
。可能会解决差异。