concurrent 并发
在并发包里只提供了一个模块,futures。在原来的基础上,提供了高并发的解决方案,高级库,进程里面是同步阻塞,异步非阻塞,两者差异。
使用异步编程就和同步的方式完全不一样了,异步非阻塞是效率较高的
concurrent.futures是一个异步并行处理的方案,是一个高级的。
multiprocessing,threading是低级库,相当于直接封装了系统调用,concurrent.futures类似(os.path 的pathlib)封装的更好,是一个异步的可执行,编程接口
异步调用的线程池的executor
一个是异步调用进程池的executor
池就是为了防止你无限制的扩张,用池来约束你对资源的使用率,池里面可以复用
ThreadPoolExecytor对象
首先需要定义一个池的执行器对象,Executor类子类对象
里面要指定最大的工作者,最大工作线程 有几个,要么直接开多少个线程,要么用一个开一个,剩下的其他的先不开(懒创建)
如何提交任务,submit,送函数,参数
这相当于泳池,泳池里可以提交任务,每提交一个任务,会为这个任务返回一个对象,future对象,future类里面可以观察当前任务执行的情况,submit提交了,会立即给你返回一个future对象,任务在进程里还是线程里面跑
查看future对象方法
返回true,就说明任务正常完成
也就是被取消成功的吗
尝试把当前任务取消掉,
result是问跑完的结果,timeout=none永久阻塞,如果到期没拿到就抛出异常
异常
执行器没提交一个任务都应该,必须返回一个future的实例,future类的实例就可以观察当前类的变化和执行,因为这个任务是将要执行完
提供这样的函数
import导入了什么
这里只有concurrent会导入当前名词空间,当前加载的模块concurrent和future都可以加载,在sys.modules可以看到
concurrent是加载到了当前名词空间,但是模块加载了两个concurrent和futures
from后面只能是模块和包
创建一个executor对象,和几个泳道
每次提交完是异步等待完成
done就是问futures对象做完了没有,现在是所有做完才是true,但凡有一个没做完就是false
做完就打印信息
每个任务完成后,主线程都在等结果,一种方式是自己看done了没有,还有就是看看回调,要么就看看result方法
两秒钟扫一次,看看做完没有
没做完之前看不到波浪线
这样每个future计算好了相当于返回一个值
提交6个任务,这6个任务提交速度很快,但是池子里只有3个
finished,began,这就是池子的作用,容量就三个,多了不行
最大1000,一般都是你要10个,开辟10个,多的不开,最多开1000个
你提交拿到future对象,通过里面的方法来判断是否执行完成,执行成功才是done
函数一定要result就加上return值
建立执行器
提交任务
观察任务返回结果
这个代码现在改成多进程
进程池放了就是要反复利用,使用进程池,把线程池改成进程池就可以了,也是一样,最大工作者有几个
写个main
这样 执行可以了
依然是三个进程
随机数就OK
这样就成了多进程版本了
io访问,如果要发挥并行的优势,就绕过GIL,大量访问IO,就进程里开辟多个线程,充分的调度多并行
执行完了可以shutdown
多线程也只是换一下这个
看到enter和exit就代表上下文管理可以用
executor对象有enter和exit
threading.enumerate只看当前进程的线程
mainprocess主进程
submit才可以创建进程或者线程,
concurrent字面意思就是解决高并发的问题,目前只提供futures,API统一,会多线程用法就会多进程
threadpoolexecutor 启动同一个进程里的线程,processpoolexecutor 启动同一个操作系统下不同的进程,但是操作接口一样,缺点无法设置进程名和线程名,但是没必要