2019/12/27 02-concurrent.futures使用
concurrent 并发
在并发包里只提供了一个模块,futures。在原来的基础上,提供了高并发的解决方案,高级库,进程里面是同步阻塞,异步非阻塞,两者差异。
使用异步编程就和同步的方式完全不一样了,异步非阻塞是效率较高的

concurrent.futures是一个异步并行处理的方案,是一个高级的。
multiprocessing,threading是低级库,相当于直接封装了系统调用,concurrent.futures类似(os.path 的pathlib)封装的更好,是一个异步的可执行,编程接口

2019/12/27 02-concurrent.futures使用
异步调用的线程池的executor
一个是异步调用进程池的executor
池就是为了防止你无限制的扩张,用池来约束你对资源的使用率,池里面可以复用

2019/12/27 02-concurrent.futures使用

ThreadPoolExecytor对象

首先需要定义一个池的执行器对象,Executor类子类对象
2019/12/27 02-concurrent.futures使用
里面要指定最大的工作者,最大工作线程 有几个,要么直接开多少个线程,要么用一个开一个,剩下的其他的先不开(懒创建)
2019/12/27 02-concurrent.futures使用
如何提交任务,submit,送函数,参数
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
这相当于泳池,泳池里可以提交任务,每提交一个任务,会为这个任务返回一个对象,future对象,future类里面可以观察当前任务执行的情况,submit提交了,会立即给你返回一个future对象,任务在进程里还是线程里面跑
2019/12/27 02-concurrent.futures使用
查看future对象方法
2019/12/27 02-concurrent.futures使用
返回true,就说明任务正常完成
2019/12/27 02-concurrent.futures使用
也就是被取消成功的吗
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
尝试把当前任务取消掉,
2019/12/27 02-concurrent.futures使用
result是问跑完的结果,timeout=none永久阻塞,如果到期没拿到就抛出异常
2019/12/27 02-concurrent.futures使用
异常
2019/12/27 02-concurrent.futures使用
执行器没提交一个任务都应该,必须返回一个future的实例,future类的实例就可以观察当前类的变化和执行,因为这个任务是将要执行完2019/12/27 02-concurrent.futures使用
提供这样的函数
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
import导入了什么2019/12/27 02-concurrent.futures使用
这里只有concurrent会导入当前名词空间,当前加载的模块concurrent和future都可以加载,在sys.modules可以看到
2019/12/27 02-concurrent.futures使用
concurrent是加载到了当前名词空间,但是模块加载了两个concurrent和futures

from后面只能是模块和包
2019/12/27 02-concurrent.futures使用
创建一个executor对象,和几个泳道
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
每次提交完是异步等待完成2019/12/27 02-concurrent.futures使用
done就是问futures对象做完了没有,现在是所有做完才是true,但凡有一个没做完就是false
2019/12/27 02-concurrent.futures使用
做完就打印信息
2019/12/27 02-concurrent.futures使用
每个任务完成后,主线程都在等结果,一种方式是自己看done了没有,还有就是看看回调,要么就看看result方法
2019/12/27 02-concurrent.futures使用
两秒钟扫一次,看看做完没有
2019/12/27 02-concurrent.futures使用
没做完之前看不到波浪线
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
这样每个future计算好了相当于返回一个值2019/12/27 02-concurrent.futures使用
提交6个任务,这6个任务提交速度很快,但是池子里只有3个
2019/12/27 02-concurrent.futures使用
finished,began,这就是池子的作用,容量就三个,多了不行
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
最大1000,一般都是你要10个,开辟10个,多的不开,最多开1000个2019/12/27 02-concurrent.futures使用
你提交拿到future对象,通过里面的方法来判断是否执行完成,执行成功才是done2019/12/27 02-concurrent.futures使用
函数一定要result就加上return值2019/12/27 02-concurrent.futures使用
建立执行器
2019/12/27 02-concurrent.futures使用
提交任务
2019/12/27 02-concurrent.futures使用
观察任务返回结果
2019/12/27 02-concurrent.futures使用
这个代码现在改成多进程
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
进程池放了就是要反复利用,使用进程池,把线程池改成进程池就可以了,也是一样,最大工作者有几个
2019/12/27 02-concurrent.futures使用
写个main2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
这样 执行可以了
2019/12/27 02-concurrent.futures使用
依然是三个进程2019/12/27 02-concurrent.futures使用
随机数就OK2019/12/27 02-concurrent.futures使用
这样就成了多进程版本了2019/12/27 02-concurrent.futures使用
io访问,如果要发挥并行的优势,就绕过GIL,大量访问IO,就进程里开辟多个线程,充分的调度多并行
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
执行完了可以shutdown
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
多线程也只是换一下这个
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
看到enter和exit就代表上下文管理可以用2019/12/27 02-concurrent.futures使用
executor对象有enter和exit
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
threading.enumerate只看当前进程的线程
2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
mainprocess主进程
2019/12/27 02-concurrent.futures使用
submit才可以创建进程或者线程,2019/12/27 02-concurrent.futures使用2019/12/27 02-concurrent.futures使用
concurrent字面意思就是解决高并发的问题,目前只提供futures,API统一,会多线程用法就会多进程
threadpoolexecutor 启动同一个进程里的线程,processpoolexecutor 启动同一个操作系统下不同的进程,但是操作接口一样,缺点无法设置进程名和线程名,但是没必要
2019/12/27 02-concurrent.futures使用

相关文章: