了解asyncio已经永远运行循环和待处理任务

时间:2015-05-31 13:31:33

标签: python python-asyncio

我在理解如何将新任务挂起到已经运行的事件循环时遇到了问题。

此代码:

{{1}}

将{{1}}更改为{{1}}可以正常工作。但我真的很困惑 - 为什么我不能在已经运行的循环上执行任务?

1 个答案:

答案 0 :(得分:11)

问题在于对loop.run_forever()的调用阻塞;它启动事件循环,并且在您明确停止循环之前不会返回 - 因此forever run_forever 部分。您的程序从未明确停止事件循环,因此永远无法进行asyncio.async(blocking("ls"))调用。

使用asyncio.async向已经运行的循环添加新任务很好,您只需要确保该函数实际上是从事件循环内的协同程序或回调内部调用的。以下是一些例子:

安排blocking在事件循环开始后立即运行:

def main():
    logging.info("in main funciton")
    loop = asyncio.get_event_loop()
    logging.info("new loop created")
    logging.info("loop running forever")
    asyncio.async(blocking("ls"))
    loop.run_forever()

从事件循环执行的回调计划blocking

def start_blocking():
    asyncio.async(blocking("ls"))

def main():
    logging.info("in main funciton")
    loop = asyncio.get_event_loop()
    logging.info("new loop created")
    logging.info("loop running forever")
    loop.call_soon(start_blocking)  # Calls start_blocking once the event loop starts
    loop.run_forever()