协程 进程_线程-多进程-协程?

1c29aac52091647dce0c1278f6cbb739.png

使用到的工具

  • 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


使用线程时所花的时间

在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


使用协程时所花的时间

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

总结
从以上例子可以看出使用线程-多进程-协程的威力,提高系统密集型运算的效率可见一斑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值