python 协程之asyncio (三)

嵌套

在一般的爬虫中,涉及的IO操作诸多,从网络请求到磁盘写入数据,都需要大量的时间成本,那么,如果封装大量的IO操作过程,

就会非常明显的提高效率,这个方式就是协程嵌套,可以通过一个协程await 其他协程来实现嵌套。

方法一:

import asyncio,time
async def wait(name,hour):
    print ('%s 等待%d秒'%(name,hour))
    await asyncio.sleep(hour)
    return '%s 执行完成 '%name
async def run():
    name_list = ['jack', 'tom', 'mary', 'susan']
    # 封装协程对象列表
    coroutine_list=[]
    for i in range(len(name_list)):
        coroutine_list.append(wait(name=name_list[i],hour=i+1))
    # 封装任务对象列表
    task_list=[]
    for i in coroutine_list:
        task_list.append(asyncio.ensure_future(i))
    # 获取协程对象的执行结果,返回一个元组,dones是返回的执行结果
    dones,pendings=await asyncio.wait(task_list)
    for task in dones:
        print('执行结果:',task.result())
if __name__ == '__main__':
    now=lambda:time.time()
    start=now()
    loop=asyncio.get_event_loop()
    loop.run_until_complete(run())
    print('耗时: %0.3f'%(now()-start))

 

 

方法二:

  使用gather创建协程对象,那么await的返回值就是协程对象运行的结果,对上述代码稍微修改:

results=await asyncio.gather(*task_list)
for result in results:
print('执行结果:',result)

 

posted @ 2021-10-22 17:00  瘦阿瘦  阅读(90)  评论(0编辑  收藏  举报