多任务异步协程的实现

先导包

 import asyncio
 import time

导入time模块是因为我们要计算程序执行的耗时来确定该任务是否是基于多任务异步协程

然后封装一个函数,用于模拟url的请求,并加上async用于返回一个协程对象。

 async def requset(url):
     print('正在下载',url)
     time.sleep(2)
     print('下载完毕',url)

然后定义协程对象

 urls=[
     'www.baidu.com',
     'www.sougou.com',
     'www.goubanjia.com'
     ]
 for url in urls:
     c=requset(url)#拿到一个协程对象

将协程对象封装到任务对象中

 task=asyncio.ensure_future(c)

将任务对象注册到时间循环中

因为我们有多任务,在循环外先定义一个任务列表

 tasks-[]

将任务对象添加到任务列表中

 for url in urls:
     c=requset(url)
     task=asyncio.ensure_future(c)
     tasks.append(task)

将三个任务对象注册到任务列表中

 loop=asyncio.get_event_loop()
 #需要将任务列表封装到wait中
 loop.run_until_complete(asyncio.wait(tasks))

接下来设置程序开始执行的时间设定

程序开始处

 start=time.time()

程序末尾

 print(time.time()-start)

我们现在有三个任务,一个任务执行时间为2s,如果为同步,应该为6s,如果是异步,则为2s

输出后显示结果为6s,说明现在为同步。

在异步协程中,如果出现了同步模块相关的代码,那么就无法异步

是因为

 time.sleep(2)

为同步代码。

在它前面加上asyncio将其变为异步,且当在asyncio中遇到阻塞操作,必须进行手动挂起await

 await asyncio.sleep(2)

这样就变成了2s!!!

完整代码如下

 import asyncio
 import time
 async def requset(url):
     print('正在下载',url)
     #在异步协程中,如果出现了同步模块相关的代码,那么就无法异步。
     #当在asyncio中遇到阻塞操作,必须进行手动挂起await
     #time.sleep(2)
     await asyncio.sleep(2)
     print('下载完毕',url)
 start=time.time()
 urls=[
     'www.baidu.com',
     'www.sougou.com',
     'www.goubanjia.com'
     ]
 #任务列表,需要存放多个任务对象
 tasks=[]
 for url in urls:
     c=requset(url)
     task=asyncio.ensure_future(c)
     tasks.append(task)
 ​
 loop=asyncio.get_event_loop()
 #需要将任务列表封装到wait中
 loop.run_until_complete(asyncio.wait(tasks))
 ​
 print(time.time()-start)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值