想要实现协程并发下载,需要将对应的 coroutine function 转为 task,然后再将 task 加入到 event loop 中才能实现并发。
2.错误的实现
如果没有将 coroutine function 转为 task,而是直接 await 调用 coroutine function,那么就会变成串行下载,而不是并发下载。
错误示例如下,可以自己测试一下,最终结果是串行下载的
1 2 3 4
asyncdefmain(): coroutine_functions = [async_download(url, idx) for idx, url inenumerate(urls)] for coroutine_function in coroutine_functions: await coroutine_function
3.怎么将 coroutine function 转为 task
可以去网上搜,方式有很多,代码里的 asyncio.create_task 和 asyncio.gather 都能够将 coroutine function 转为 task。
这里提供一个和错误示例相对应的正确示例
1 2 3 4
asyncdefmain(): tasks = [asyncio.create_task(async_download(url, idx)) for idx, url inenumerate(urls)] for task in tasks: await task