一、
首先创建三个服务器,代码如下:
flask服务器.py
1 from flask import Flask 2 import time 3 4 app = Flask(__name__) 5 6 @app.route('/bobo') 7 def index_bobo(): 8 time.sleep(2) 9 return 'Hello bobo' 10 11 @app.route('/jay') 12 def index_jay(): 13 time.sleep(2) 14 return 'Hello jay' 15 16 @app.route('/tom') 17 def index_tom(): 18 time.sleep(2) 19 return 'Hello tom' 20 21 if __name__=="__main__": 22 app.run(threaded=True)
运行:
然后开始编写多任务协程
1 import requests 2 import asyncio 3 import time 4 5 6 start=time.time() 7 urls=[ 8 'http://127.0.0.1:5000/bobo','http://127.0.0.1:5000/jay','http://127.0.0.1:5000/tom' 9 ] 10 11 async def get_page(url): 12 print('正在下载',url) 13 response=requests.get(url=url) 14 print('下载完毕',response.text) 15 16 tasks=[] 17 18 for url in urls: 19 c=get_page(url) 20 task=asyncio.ensure_future(c) 21 tasks.append(task) 22 23 loop = asyncio.get_event_loop() 24 loop.run_until_complete(asyncio.wait(tasks)) 25 26 end=time.time() 27 print('总耗时:',end-start)
运行结果:
总耗时与串行操作差不多,为什么?
因为requests.get是基于同步的,必须使用基于异步的网络请求模块进行指定url的请求发送
而aiohttp:基于异步网络请求的模块
1 import requests 2 import asyncio 3 import time 4 import aiohttp 5 6 start=time.time() 7 urls=[ 8 'http://127.0.0.1:5000/bobo','http://127.0.0.1:5000/jay','http://127.0.0.1:5000/tom' 9 ] 10 11 async def get_page(url): 12 async with aiohttp.ClientSession() as session: 13 #get()、post(): 14 #headers、params/data,proxy='http://ip:port' 15 async with await session.get(url) as response: 16 #text()返回字符串形式的响应数据 17 #read()返回的二进制形式的响应数据 18 #json()返回的就是json对象 19 #注意:获取响应数据操作之前一定要使用await进行手动挂起 20 page_text=await response.text() 21 print(page_text) 22 # print('正在下载',url) 23 # response=requests.get(url=url) 24 # print('下载完毕',response.text) 25 26 tasks=[] 27 28 for url in urls: 29 c=get_page(url) 30 task=asyncio.ensure_future(c) 31 tasks.append(task) 32 33 loop = asyncio.get_event_loop() 34 loop.run_until_complete(asyncio.wait(tasks)) 35 36 end=time.time() 37 print('总耗时:',end-start)
运行结果: