![1c29aac52091647dce0c1278f6cbb739.png](https://i-blog.csdnimg.cn/blog_migrate/302ef51dd121297c524066a796a66226.jpeg)
使用到的工具
- Win7, Python3.6
- 使用到的Python库 requests,concurrent.futures,asyncio,aiohttp,time
- 编辑器 sublime_text3
概念
- 进程的出现是为了更好的利用CPU资源使到并发成为可能
- 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。
- 协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。
- 为了提高系统密集型运算的效率,对于I/O密集型,可以使用多线程或者多进程来提高效率
相关代码
不使用线程,多进程,协程时所花的时间
import time
import requests
num_list = range(20)
url = 'http://httpbin.org/get?num={}'
def get_result(num):
res = requests.get(url.format(num))
return res.json()['args']['num']
start = time.time()
for each in num_list:
result = get_result(each)
print('get num {} result:{}'.format(each,result))
print('use time:{}'.format(time.time()-start))
![75cf79196a4a9e5979da59b7e9dadcf9.png](https://i-blog.csdnimg.cn/blog_migrate/d0ac41c8a11c665cef6f6a69ac058830.jpeg)
使用线程时所花的时间
在3.2版本的python中,将进程与线程进一步封装成concurrent.futures
import time
import requests
from concurrent.futures import ThreadPoolExecutor
num_list = range(20)
url = 'http://httpbin.org/get?num={}'
def get_result(num):
res = requests.get(url.format(num))
return res.json()['args']['num']
start = time.time()
#使用线程池(使用8个线程)
with ThreadPoolExecutor(max_workers=8) as executor:
for num,result in zip(num_list,executor.map(get_result,num_list)):
print('get num {} result:{}'.format(num,result))
print('use time:{}'.format(time.time()-start))
![5ffd64ad1641917c92123af92c4eccce.png](https://i-blog.csdnimg.cn/blog_migrate/38e0397c3f52d6425bc3e545c7af34fa.jpeg)
使用协程时所花的时间
python3.4之后加入的asyncio包则是对协程的实现
import time
import aiohttp
import asyncio
num_list = range(20)
url = 'http://httpbin.org/get?num={}'
async def get_result_async(num):
async with aiohttp.request('GET',url.format(num)) as coroutine:
data = await coroutine.json()
return data['args']['num']
start = time.time()
loop = asyncio.get_event_loop()
tasks = [get_result_async(num) for num in num_list]
results = loop.run_until_complete(asyncio.gather(*tasks))
for num,results in zip(num_list,results):
print('get num {} result:{}'.format(num,results))
print('use time:{}'.format(time.time()-start))
![ad3ea2d673fcdc74ad478922bd067510.png](https://i-blog.csdnimg.cn/blog_migrate/b0028dee6a87ba892b004c4fbac9938a.jpeg)
总结
从以上例子可以看出使用线程-多进程-协程的威力,提高系统密集型运算的效率可见一斑。