先导包
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)