【问题标题】:Can I start a coroutine in Python without the blocking await?我可以在没有阻塞等待的情况下在 Python 中启动协程吗?
【发布时间】:2021-07-07 13:11:33
【问题描述】:

这里是示例代码

async def washing():
  await asyncio.sleep(3)
  print("All washed!")

async def myloop():
  while 1:
    await washing() #Is there an alternative to start washing coroutine?
    print("start washing...")
    await asyncio.sleep(5)

asyncio.run(myloop())

显然我会得到“全部洗过!”然后“开始洗涤...”打印出来,因为等待是阻塞的 - 它不会继续执行,直到命令执行后。

但我想要的是反过来,先“开始洗”。

我可以以非阻塞方式启动洗涤协程并继续执行下一个命令(例如打印)吗?这比简单的谁先打印的问题要严重得多,它是关于是否可以任意创建一个辅助协程。在这种阻塞方式下,虽然有两个异步函数,但它们不是并行运行,而是顺序运行,并且永远锁定在一个协程中。

【问题讨论】:

  • 为什么不打印“开始洗涤”然后等待洗涤()?
  • 这真的取决于你的目标,但asyncio.create_task 可能是你要找的。​​span>
  • '为什么不打印“开始洗涤”然后等待洗涤()? ' - 这是一个简化的示例。真正的场景是启动另一个线程来执行一项可能需要数小时才能完成的意外任务。

标签: python python-asyncio


【解决方案1】:

如果你想让一些异步任务并行工作,只需使用asyncio.create_task

import asyncio


async def washing():
    await asyncio.sleep(3)
    print("All washed!")


async def myloop():
    while 1:
        # create Task to change the app flow
        asyncio.create_task(washing())
        print("start washing...")
        await asyncio.sleep(5)


if __name__ == '__main__':
    asyncio.run(myloop())

请注意,如果 myloop 将在清洗任务之前完成,您将永远无法获得该任务的结果。

【讨论】:

猜你喜欢
  • 2020-12-01
  • 2021-07-17
  • 2019-12-02
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多