【问题标题】:Python relations between run_until_complete and ensure_futurerun_until_complete 和 ensure_future 之间的 Python 关系
【发布时间】:2018-08-12 12:34:19
【问题描述】:

这是这个问题的后续问题:

Why do most asyncio examples use loop.run_until_complete()?

我试图弄清楚异步编程在 python 中是如何工作的。有一些非常基本的东西我仍然不确定..

当有这行代码:asyncio.ensure_future(someTask) 时,这行 ALONE 是否会真正将默认事件循环中返回的Future 排入队列并启动任务?或者我是否还需要在此之前调用loop.run_until_complete(someTask)(或其他类型的运行)才能启动和运行事件循环?

【问题讨论】:

    标签: python python-asyncio


    【解决方案1】:

    asyncio.ensure_future(someTask) 这行 ALONE 是否会真正将默认事件循环中返回的 Future 排入队列并启动任务?

    它将调度协程,但不会运行它。您仍然需要运行循环来执行此操作。你可以用

    loop.run_forever()
    

    如果您希望循环一直运行到 someTask 完成而不是一直运行,请使用

    future = asyncio.ensure_future(someTask)
    loop.run_until_complete(future)
    

    不要同时调用asyncio.ensure_future(someTask)loop.run_until_complete(someTask),否则你会得到RuntimeError,因为someTask 已经安排好了。

    【讨论】:

    • 那我们为什么要写asyncio.ensure_future(someTask)而不是loop.run_until_complete(someTask)
    【解决方案2】:

    如果有这行代码:asyncio.ensure_future(someTask),这行 ALONE 是否会真正将默认事件循环中返回的 Future 入队并启动任务?

    这取决于行的执行时间。如果它在事件循环运行时从某个协程执行,那么您真的不需要做任何其他事情 - 任务会神奇地“在后台”运行。

    如果事件循环尚未运行,那么您需要启动事件循环以运行 任何 任务,而不仅仅是新添加的任务。 loop.run_until_complete(some_specific_task) 只是一个选项,另一个是loop.run_forever(),意思是“运行事件循环,直到有人调用loop.stop()”。

    请注意,ensure_future(task) 是无操作的,因为如果您已经有一个 Task,它将原封不动地返回。 ensure_future(some_coroutine()) 会将协程包装到 Task 中,将其安排在事件循环中,然后返回它,从而有效地为您调用 loop.create_task()。当参数已知为协程时,直接调用create_taskrecommended

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 2011-06-30
      • 1970-01-01
      • 2021-12-11
      • 2011-09-06
      • 2016-06-10
      相关资源
      最近更新 更多