3种方式实现python多线程并发处理
文章目录
3种方式实现python多线程并发处理
最优线程数
Ncpu=CPU的数量
Ucpu=目标CPU使用率
W/C=等待时间与计算时间的比率
为保持处理器达到期望的使用率,最优的线程池的大小等于
$$Nthreads=NcpuUcpu(1+W/C)$$cpu密集型任务,即$W<<C$,则$W/C≈0$,则$Nthreads=Ncpu*Ucpu$
如果希望CPU利用率为100%,则$Nthreads=Ncpu$IO密集型任务,即系统大部分时间在跟I/O交互,而这个时间线程不会占用CPU来处理,即在这个时间范围内,可以由其他线程来使用CPU,因而可以多配置一些线程。
混合型任务,二者都占有一定的时间
线程池
对于任务数量不断增加的程序,每有一个任务就生成一个线程,最终会导致线程数量的失控。对于任务数量不端增加的程序,固定线程数量的线程池是必要的。
方法一:使用threadpool模块
threadpool是一个比较老的模块了,支持py2 和 py3 。
1 | import threadpool |
方法二:使用concurrent.futures模块
1 | from concurrent.futures import ThreadPoolExecutor |
方法三:使用vthread模块
参考:https://pypi.org/project/vthread/
demo1
1 | import vthread |
demo2:分组线程池
1 | import vthread |