方法基本完成后,AsyncIO任务不会结束

时间:2019-03-31 09:08:54

标签: python python-3.x python-asyncio coroutine

我试图运行协程,并等待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秒钟才能完成。

这里有什么我想念的吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

    break上的
  1. some_criteria将使current_time过时(因为将不考虑当前迭代)
  2. 上次存储async with后,可能会发生current_time退出清理工作

您绝对应该在打印current_time = time()之前放置行return:。可能会解决差异。