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)