一:进程池与线程池

提交任务的两种方式:

1、同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行

2、异步调用:提交完一个任务之后,不是原地等待,而是直接执行下一行代码,会导致任务是并发执行的,结果future对象会在任务运行完毕后自动传给回调函数

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time, random, osdef task(name, n):print('%s%s is running' % (name, os.path.getpid()))time.sleep(random.randint(1, 3))return n ** 2if __name__ == '__main__':# print(os.cpu_count())p = ProcessPoolExecutor(4)l = []for i in range(5):# 同步提交# res = p.submit(task, '进程pid:', i).result()# print(res)# 异步提交future=p.submit(task,'进程pid:',i)l.append(future)p.shutdown(wait=True) # 关闭进程池的入口,并且在原地等待进程池内所有任务运行完毕for future in l:print(future.result)print('主')

View Code

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import time,random,os
import requestsdef get(url):print('%s GET %s' %(os.getpid(),url))time.sleep(3)response=requests.get(url)if response.status_code == 200:res=response.textelse:res='下载失败'parse(res)def parse(res):time.sleep(1)print('%s 解析结果为%s' %(os.getpid(),len(res)))if __name__ == '__main__':urls=['https://www.baidu.com','https://www.sina.com.cn','https://www.tmall.com','https://www.jd.com','https://www.python.org','https://www.openstack.org','https://www.baidu.com','https://www.baidu.com','https://www.baidu.com',]p=ProcessPoolExecutor(9)l=[]start=time.time()for url in urls:future=p.submit(get,url)l.append(future)p.shutdown(wait=True)print('主',time.time()-start)

View Code

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import time,random,os
import requestsdef get(ur1):print('%s GET %s'%(os.getpid(),ur1))time.sleep(3)response=requests.get(ur1)if response.status_code==200:res=response.textelse:res='下载失败'parse(res)def parse(res):time.sleep(1)print('%s 解析结果为%s'%(os.getpid(),len(res)))if __name__ == '__main__':urls=['https://www.baidu.com''https://www.youku.com''https://www.wangyiyun.com''https://www.baidu.com''https://www.baidu.com''https://www.baidu.com']p=ProcessPoolExecutor(9)l=[]start=time.time()for url in urls:future=p.submit(get,url)l.append(future)p.shutdown(wait=True)print('主',time.time()-start)

View Code

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
from threading import current_thread
import time, random, os
import requsetsdef get(url):print('%s GET %s' % (current_thread().name, url))time.sleep(3)respose = requsets.get(url)if respose.status_code == 200:res = respose.textelse:res = '下载失败'return resdef parse(future):time.sleep(1)res = future.result()print('%s 解析结果为%s' % (current_thread().name, len(res)))if __name__ == '__main__':urls = ['https://www.baidu.com''https://www.youku.com''https://www.wangyiyun.com''https://www.baidu.com''https://www.baidu.com''https://www.baidu.com']p = ProcessPoolExecutor(9)start = time.time()for url in urls:future = p.submit(get, url)# 异步调用:提交完一个任务之后,不是原地等待,# 而是直接执行下一行代码,会导致任务是并发执行的,# 结果future对象会在任务运行完毕后自动传给回调函数future.add_done_callback(parse)  # parse会在任务运行完毕后自动触发,然后接收一个参数future对象
p.shutdown(wait=True)print('主', time.time() - start)print('主', os.getpid())

View Code

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
from threading import current_thread
import time,random,os
import requestsdef get(url):print('%s GET %s'%(current_thread().name,url))time.sleep(3)response=requests.get(url)if response.status_code==200:res=response.textelse:res='下载失败'return resdef parse(future):time.sleep(1)res=future.result()print('%s 解析结果为%s'%(current_thread().name,len(res)))if __name__ == '__main__':urls = ['https://www.baidu.com''https://www.youku.com''https://www.wangyiyun.com''https://www.baidu.com''https://www.baidu.com''https://www.baidu.com']p=ThreadPoolExecutor(4)for url in urls:future=p.submit(get,url)future.add_done_callback(parse)p.shutdown(wait=True)print('主',current_thread().name)

View Code

二:协程

协程介绍

协程是单线程下的并发,又称微线程,英文名 Coroutine

一句话说明什么是线程:协程是一种后能耗态的轻量级线程,即协程是由用户程序自己控制调度的。

需要强调的是:

#1. python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行)
#2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关)

对比操作系统控制线程的切换,用户在单线程内控制协程的切换

优点如下:

#1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
#2. 单线程内就可以实现并发的效果,最大限度地利用cpu

缺点如下:

#1. 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
#2. 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程

总结协程特点:

1、必须在只有一个单线程里实现并发

2、修改共享数据不需要加锁

3、用户程序里总结保存多个控制流的上下文栈

4、附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield,greenlet都无法实现,就用到了gevent模块(select机制))

基于单线程下实现并发,只有一个主线程(如下图:可利用的CPU只有一个)的情况下实现并发,并发的本质:切换+保存状态

CPU正在运行一个任务,会在两种情况下自习其他任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务占用时间过长或有一个优先级更高的程序代替了它

#串行执行
import time
def func1():for i in range(10000):i+1def func2():for i in range(10000):i+1start=time.time()
func1()
func2()
stop=time.time()
print(stop -start)

串行执行

#1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级
#2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换  

#基于yield并发执行
import time
def func1():while True:print('func1')10000+1yielddef func2():g=func1()for i in range(10000):print('func2')time.sleep(100)i+1next(g)start=time.time()
func2()
stop=time.time()
print(stop-start)

yield并发执行

ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以可以将上图理解为线程的三种状态

转载于:https://www.cnblogs.com/zedong/p/9622750.html

Python 37 进程池与线程池 、 协程相关推荐

  1. python线程池模块_python并发编程之进程池,线程池,协程

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  2. python线程池模块_python并发编程之进程池,线程池,协程(Python标准模块--concurrent.futures(并发未来))...

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  3. python协程池_python3下multiprocessing、threading和gevent性能对比—-暨进程池、线程池和协程池性能对比 | 学步园...

    目前计算机程序一般会遇到两类I/O:硬盘I/O和网络I/O.我就针对网络I/O的场景分析下python3下进程.线程.协程效率的对比.进程采用multiprocessing.Pool进程池,线程是自己 ...

  4. python进程池和线程池_python自带的进程池及线程池

    进程池 """ python自带的进程池 """ from multiprocessing import Pool from time im ...

  5. 进程池、线程池、回调函数、协程

    阅读目录 摘要: 进程池与线程池 同步调用和异步调用 回调函数 协程 一.进程池与线程池: 1.池的概念: 不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源. 也就是说,硬件的承载能力是有 ...

  6. python 进程池阻塞和非阻塞_python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)...

    9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型池子内什么时候装线程:并发的任务属于IO ...

  7. 并发编程之进程池,线程池 和 异步回调,协程

    1.进程池和线程池 2.异步回调 3.协程 4.基于TCP使用多线程实现高并发 一.进程池和线程池 什么是进程池和线程池: ''' 池 Pool 指的是一个容器 线程池就是用来存储线程对象的 容器创建 ...

  8. python进程池和线程池_Python中的进程池与线程池(包含代码)

    引入进程池与线程池 使用ProcessPoolExecutor进程池,使用ThreadPoolExecutor 使用shutdown 使用submit同步调用 使用submit异步调用 异步+回调函数 ...

  9. 进程池和线程池,协程,IO多路复用

    进程池.线程池: 开进程池和线程池都是要消耗资源的,只不过比较而言消耗的资源进程池多一点,线程池少一点 就是在计算机硬件能承受的最大范围内去利用计算机. 什么是池? 就是在保证计算机硬件安全的情况最大 ...

最新文章

  1. 基于OpenCV的条形码检测
  2. 微服务2017年度报告出炉:4大客户画像,15%传统企业已领跑
  3. cli/c++与C#比较之我见
  4. Web 仿 App 动画竟然引出了“性能杀手”
  5. 未来已来,音视频江湖再起波澜
  6. php+换行+php+eol,PHP PHP_EOL 换行符
  7. quartz java spring_从零开始学 Java - Spring 使用 Quartz 任务调度定时器
  8. ios 6.1中 Release问题
  9. Android MuPDF 部署
  10. Android 项目中用得最多最火的第三方框架可能都在这里了
  11. 几种常用的PID控制算法
  12. 指纹识别传感器技术演变历程
  13. cad灯具图标_灯具在CAD中怎么表示出来 都代表哪种灯 谢谢
  14. 戴尔服务器r720矩阵卡无响应,戴尔r720阵列卡驱动
  15. 【转载】面对酱紫的情况,肿么办哇?
  16. 5G套餐资费会越来越便宜,但需注意“限速机制”
  17. 石油化工企业防雷工程和防雷接地应用方案
  18. 如何解决layui弹出层闪退的问题
  19. netterm linux,NetTerm终端仿真软件下载
  20. 求职 个人简历 手机软件开发工程师

热门文章

  1. 1.three.js世界的4大要素
  2. 如何在VS和CB中配置MySQL环境
  3. PHP Uploadify+jQuery.imgAreaSelect插件+AJAX 实现图片上传裁剪 仿微博头像上传功能
  4. 简单排序算法设计(Java)
  5. VBScript学习笔记 - 数组
  6. spring注解配置quartz
  7. 多行字符串的表示方式
  8. 为Java应用程序加上退出事件处理(ShutdownHook)
  9. XNA中的Render State管理
  10. jmeter 压测duobbo接口,施压客户端自己把自己压死了