我是异步编程的新手。
我的理解是,它对于并行运行但需要大量等待的任务很有用。例如,可以并行完成10个zip归档文件的下载和解压缩,但是由于“下载”部分只是CPU的等待时间,因此asyncio在这里是一个有用的概念。如果我错了,请纠正我。
我看过的所有教程都遵循上述类似的示例性问题,并通过创建一堆等待对象来解决该问题,然后将它们全部等待。 (例如,通过gather
)
但是,对我来说,启动这样的异步操作似乎是一个普遍的要求,例如下载文件后,继续并行执行其他工作,直到实际需要该文件,然后再进行检索。这基本上就是“未来”所代表的。
我看不到如何用异步函数来实现。如果我不“等待”对download_file
的调用,那么它甚至都不会执行初始设置,并且下载也不会开始。如果我立即“等待”呼叫,它将等待整个下载完成,而我将无法并行执行任何工作。
我想出的唯一解决方案是让download_file
返回一个可以等待的未来。那真的是最好的方法吗?如果是这样,那么,如果我们仍然必须使用引入“异步”关键字之前必须使用的期货之类的对象,那该怎么办呢?
答案 0 :(得分:1)
解决方案(在asyncio中)是使用类似的东西:
download_task = asyncio.create_task(download_file(...))
... code continues executing ...
这会在“后台”中生成download_file()
(用引号引起来是因为asyncio是单线程的,因此后台没有任何内容)。然后,您可以开展业务,通常做其他事情,最重要的是,等待其他事情,当您需要完成下载时,请使用await download_task
获得结果。< / p>
我想出的唯一解决方案是让
download_file
返回可期待的未来。
asyncio.create_task()
有效地将任何协程(异步定义)转换为可以等待的未来。
如果是这样,那么,如果我们仍然必须使用引入“异步”关键字之前必须使用的期货之类的对象,那么异步还有什么意义呢?
重点是您拥有协程:实现和撰写这些期货的一种非常方便的工具。您可以像编写普通的顺序代码一样编写诸如downlooad_file
这样的函数,但是可以使其与其他异步代码并行运行。