报错语句:
loop.run_until_complete(tasks)
改成:
loop.run_until_complete(asyncio.wait(tasks))
说明:
解决方法:将任务对象封装到asyncio.wait中。这里wait函数的作用是给tasks列表中每一个任务对象赋予一个可被挂起的权限。
具体原理:在执行任务对象的过程中,一旦发生阻塞,就将这个任务对象挂起,挂起后,我们就可以控制它交出cpu使用权,以供其他任务对象去抢。
完整代码:
import asyncio
import timestart = time.time()
urls = [1, 2, 3]# 特殊函数
async def get_request(url):print('正在请求:', url)# await使用场景:特殊函数内部有阻塞操作时,就需要在阻塞操作前面加上await关键字# await作用: 人为主动检测阻塞环节(人为标注告诉程序这是阻塞操作)await asyncio.sleep(2)print('请求结束:', url)# 任务列表
tasks = [] # 存储多个任务对象
for url in urls:# 循环创建3个协程对象c = get_request(url)# 循环场景3个任务对象task = asyncio.ensure_future(c)# 循环将任务对象添加到列表中tasks.append(task)# 事件循环对象放在循环外面 (事件循环是一个容器)
loop = asyncio.get_event_loop()
# wait使用场景:当把多个任务存储到事件循环对象时,就需要给每个任务赋予挂起权限
# wait作用:这里wait函数的作用是给tasks列表中每一个任务对象赋予一个可被挂起的权限。
# wait原理:在执行任务对象的过程中,一旦发生阻塞,就将其挂起,我们就可以控制它交出cpu使用权,以供其他任务对象去抢。
loop.run_until_complete(asyncio.wait(tasks)) # 把多个任务对象放到事件循环对象中,并启动它print('总耗时:', time.time() - start)