一、异步协程的基本使用
-event_loop:事件,相当于一个无线循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。
-coroutine:协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。
我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。
-task:任务,它是对协程对象的进一步封装,包含了任务的各个状态。
-future:代表将来执行或还没有执行的任务,实际上和task没有本质区别。
-async 定义一个协程
-await 用来挂起阻塞方法的执行。
1、创建一个事件循环对象
1 import asyncio 2 3 async def request(url): 4 print(‘正在请求的url是‘,url) 5 print(‘请求成功‘,url) 6 7 #async修饰的函数,调用之后返回一个协程对象 8 c=request(‘www.baidu.com‘) 9 10 #创建一个事件循环对象 11 loop=asyncio.get_event_loop() 12 13 #将协程对象注册到loop中,然后启动loop 14 loop.run_until_complete(c)
2、task的使用
1 import asyncio 2 3 async def request(url): 4 print(‘正在请求的url是‘,url) 5 print(‘请求成功‘,url) 6 7 #async修饰的函数,调用之后返回一个协程对象 8 c=request(‘www.baidu.com‘) 9 10 #task的使用 11 loop = asyncio.get_event_loop() 12 #基于loop创建一个task对象 13 task=loop.create_task(c) 14 15 loop.run_until_complete(task) 16 17 print(task)
3、future的使用
1 import asyncio 2 3 async def request(url): 4 print(‘正在请求的url是‘,url) 5 print(‘请求成功‘,url) 6 7 #async修饰的函数,调用之后返回一个协程对象 8 c=request(‘www.baidu.com‘) 9 10 #future的使用 11 loop = asyncio.get_event_loop() 12 task= asyncio.ensure_future(c) 13 print(task) 14 loop.run_until_complete(task) 15 print(task)
4、绑定回调
1 import asyncio 2 3 async def request(url): 4 print(‘正在请求的url是‘,url) 5 print(‘请求成功‘,url) 6 return url 7 8 #async修饰的函数,调用之后返回一个协程对象 9 c=request(‘www.baidu.com‘) 10 11 def callback_func(task): 12 #result返回的就是任务对象中封装的协程对象对应函数的返回值 13 print(task.result()) 14 15 #绑定回调 16 loop = asyncio.get_event_loop() 17 task = asyncio.ensure_future(c) 18 #将回调函数绑定到任务对象中 19 task.add_done_callback(callback_func) 20 loop.run_until_complete(task)
二、多任务协程
1 import asyncio 2 import time 3 4 async def request(url): 5 print(‘正在下载‘,url) 6 time.sleep(2) 7 print(‘下载完毕‘,url) 8 9 start=time.time() 10 11 urls=[ 12 ‘www.baidu.com‘, 13 ‘www.sogou.com‘, 14 ‘www.goubanjia.com‘ 15 ] 16 17 #任务列表:存在多个任务对象 18 stacks=[] 19 20 for url in urls: 21 c=request(url) 22 task=asyncio.ensure_future(c) 23 stacks.append(task) 24 25 loop = asyncio.get_event_loop() 26 #需要将任务列表封装到wait中 27 loop.run_until_complete(asyncio.wait(stacks)) 28 29 print(time.time()-start)
运行结果:
发现多任务协程是同步的,这是为什么?
#在异步协程中如果出现了同步模块相关的代码,那么就无法实现异步。
# time.sleep(2)
#当在asyncio中遇到阻塞操作必须进行手动挂起
1 import asyncio 2 import time 3 4 async def request(url): 5 print(‘正在下载‘,url) 6 #在异步协程中如果出现了同步模块相关的代码,那么就无法实现异步。 7 # time.sleep(2) 8 #当在asyncio中遇到阻塞操作必须进行手动挂起 9 await asyncio.sleep(2) 10 print(‘下载完毕‘,url) 11 12 start=time.time() 13 14 urls=[ 15 ‘www.baidu.com‘, 16 ‘www.sogou.com‘, 17 ‘www.goubanjia.com‘ 18 ] 19 20 #任务列表:存在多个任务对象 21 stacks=[] 22 23 for url in urls: 24 c=request(url) 25 task=asyncio.ensure_future(c) 26 stacks.append(task) 27 28 loop = asyncio.get_event_loop() 29 #需要将任务列表封装到wait中 30 loop.run_until_complete(asyncio.wait(stacks)) 31 32 print(time.time()-start)
运行结果:
原文:https://www.cnblogs.com/industrial-fd-2019/p/14420351.html