进程池与线程池
Event事件
Event事件的作用
用来控制线程的执行,由一些线程去控制另一些线程
进程池与线程池
-
什么是进程池与线程池
进程池与线程池是用来控制当前程序允许创建(进程/线程)的数量
-
进程池与线程池的作用
保证在硬件允许的范围内创建(进程/线程)的数量
-
如何使用
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import time # ProcessPoolExecutor(5) # 5代表只能开启5个进程 # ProcessPoolExecutor() # 默认以CPU的个数限制进程数 pool = ThreadPoolExecutor(5) # 5代表只能开启5个线程 -5 +1 -1 +1 -1 # ThreadPoolExecutor() # 默认以CPU个数 * 5 限制线程数 # t = Tread() # 异步提交 # t.start(0) # pool.submit('传函数地址') # 异步提交任务 # def task(): # print('线程任务开始了...') # time.sleep(1) # print('线程任务结束了...') # # # for line in range(5): # pool.submit(task) # 异步提交任务 # pool.submit('传函数地址').add_done_callback('回调函数地址') def task(res): # res == 1 print('线程任务开始了...') time.sleep(1) print('线程任务结束了...') return 123 # 回调函数 def call_back(res): print(type(res)) # 注意: 赋值操作不要与接收的res同名 res2 = res.result() print(res2) for line in range(5): pool.submit(task, 1).add_done_callback(call_back) # 会让所有线程池的任务结束后,才往下执行代码 # pool.shutdown() print('hello')
协程
- 进程:资源单位
- 线程:执行单位
- 协程:在单线程下实现并发
注意:协程不是操作系统资源,他是程序起的名字,为了让单线程能实现并发
协程的目的
-
操作系统:
多道技术,切换+保存状态
- 遇到IO
- CPU执行时间过长
-
协程
通过手动模拟操作系统“多道技术”,实现 切换+保存状态
- 手动实现 遇到IO切换,欺骗操作系统误以为没有IO操作
- 单线程 计算密集型,来回切换+保存状态时,反而效率更低
优点:
在IO密集型的情况下,会提高效率
缺点:
若在计算密集型的情况下,来回切换,反而效率更低
如何实现协程:切换+保存状态
- yield:保存状态
- 并发:切换