创建进程池与线程池concurrent.futures模块的使用
一、进程池。
当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪。这时候就出现了进程池和线程池。
二、concurrent.futures模块介绍
concurrent.futures模块提供了高度封装的异步调用接口
ThreadPoolExecutor:线程池,提供异步调用
ProcessPoolExecutor:进程池,提供异步调用
Both implement the same interface, which is defined by the abstract Executor class
三、基本方法:
submit(fn, *args, **kwargs)
:异步提交任务
map(func, *iterables, timeout=None, chunksize=1)
:取代for循环submit的操作
shutdown(wait=True)
:相当于进程池的pool.close()+pool.join()
操作
- wait=True,等待池内所有任务执行完毕回收完资源后才继续
- wait=False,立即返回,并不会等待池内的任务执行完毕
- 但不管wait参数为何值,整个程序都会等到所有任务执行完毕
- submit和map必须在shutdown之前
result(timeout=None)
:取得结果
add_done_callback(fn)
:回调函数
done()
:判断某一个线程是否完成
cancle()
:取消某个任务
四、进程池代码实例——ProcessPoolExecutor
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import current_process
import time
def func(i):
print(f'进程 {current_process().name} 正在执行任务 {i}')
time.sleep(1)
return i**2
if __name__ == '__main__':
pool = ProcessPoolExecutor(4) # 进程池只有4个进程
lt = []
for i in range(20): # 假设执行20个任务
future = pool.submit(func,i) # func任务要做20次,4个进程负责完成这个20个任务
# print(future.result()) # 如果没有结果就一直等待拿到结果,导致了所有任务都在串行
lt.append(future)
pool.shutdown() # 默认为True,关闭了池的入口,会等待所有的任务执行完,结束阻塞,
for fu in lt:
print(fu.result()) # 等待所有的任务都执行完了,一起把返回值打印出来
五、线程池代码示例——ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor
from threading import currentThread
import time
def func(i):
print(f'线程 {currentThread().name} 正在执行任务 {i}')
time.sleep(1)
return i**2
if __name__ == '__main__':
fool = ThreadPoolExecutor(4) # 线程池里只有4个线程
lt = []
for i in range(20):
futrue = fool.submit(func,i) # func任务要做20次,4个线程负责完成这20次任务
lt.append(futrue)
fool.shutdown() # 默认为True,关闭了池的入口,会等待所有的任务执行完,结束阻塞,
for fu in lt:
print(fu.result()) # 等待所有的任务都执行完了,一起把返回值打印出来
六、回调函数add_done_callback(fn)
提交任务的两种方式:
同步: 提交了一个任务,必须等任务执行完了(拿到返回值),才能执行下一行代码
异步: 提交了一个任务,不要等执行完了,可以直接执行下一行代码。
ps:进程和线程回调方法的使用写一块了,注释掉的是进程的使用。
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from threading import currentThread
from multiprocessing import current_process
import time
def task(i):
print(f'线程 {currentThread().name} 正在执行任务 {i}')
# print(f'进程 {current_process().name} 正在执行任务 {i}')
time.sleep(1)
return i**2
def parse(futrue):
# 处理拿到的结果
print(futrue.result())
if __name__ == '__main__':
pool = ThreadPoolExecutor(4) # 线程池里只有4个线程
# pool = ProcessPoolExecutor(4) # 进程池里只有4个进程
lt = []
for i in range(20):
futrue = pool.submit(task,i) # task任务要做20次,分别由四个进程完成这20个任务
futrue.add_done_callback(parse)
# 为当前任务绑定一个函数,在当前任务执行结束的时候会触发这个函数
# 会把futrue对象作为参数传给函数
# 这个称之为回调函数,处理完了回来就调用这个函数。
跟上面线程池里的例子相比:回调函数的作用,不需要等待所有的任务执行完才打印返回值。每执行完一个任务直接打印结果,实现一个并发的效果,效率有所提升。
创建进程池与线程池concurrent.futures模块的使用的更多相关文章
- 线程池、进程池(concurrent.futures模块)和协程
一.线程池 1.concurrent.futures模块 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Pro ...
- 使用concurrent.futures模块中的线程池与进程池
使用concurrent.futures模块中的线程池与进程池 线程池与进程池 以线程池举例,系统使用多线程方式运行时,会产生大量的线程创建与销毁,创建与销毁必定会带来一定的消耗,甚至导致系统资源的崩 ...
- 基于concurrent.futures的进程池 和线程池
concurrent.futures:是关于进程池 和 线程池 的 官方文档 https://docs.python.org/dev/library/concurrent.futures.html 现 ...
- concurrent.futures模块(进程池/线程池)
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- Python并发编程之线程池/进程池--concurrent.futures模块
一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...
- python并发编程之进程池,线程池concurrent.futures
进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- 使用concurrent.futures模块并发,实现进程池、线程池
Python标准库为我们提供了threading和multiprocessing模块编写相应的异步多线程/多进程代码 从Python3.2开始,标准库为我们提供了concurrent.futures模 ...
- Python3【模块】concurrent.futures模块,线程池进程池
Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要 ...
随机推荐
- scrapy xpath用法
一.实验环境 1.Windows7x64_SP1 2.anaconda3 + python3.7.3(anaconda集成,不需单独安装) 3.scrapy1.6.0 二.用法举例 1.开启scrap ...
- R 包 rgl 安装失败, 报错 X11 not found but required, configure aborted 及解决方法
R 包 rgl 安装失败, X11 not found but required, configure aborted * installing *source* package ‘rgl’ ... ...
- Android使用WebView开发常见的坑
原文链接:http://mp.weixin.qq.com/s?__biz=MzAwODE1NTI2MQ==&tempkey=uP3a%2BOgIN7vPbLfJp3BTCl2KabYi1%2F ...
- [SCOI2007]压缩(动态规划,区间dp,字符串哈希)
[SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...
- Unity移动游戏加载性能和内存管理-学习笔记
前言 正在学习Doctor 张.鑫大佬的移动游戏加载性能和内存管理,内容非常非常的干,所以我烧了很多开水,边喝边看,一边拿小本几做好笔记 本文只是关于前2章的内容笔记,关于各种资源的加载耗时 纹理资源 ...
- java 正则 替换中文为空
//中文替换为"" public String replaceChineseToNULL(String s){ String reg = "[\u4e00-\u9fa5] ...
- 分布式CAP理论
分布式CAP理论 来自wiki: 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下 ...
- 二分查找法---scala方式
二分查找法---scala方式 ,b) } }
- Unity/C#基础复习(5) 之 浅析观察者、中介者模式在游戏中的应用与delegate原理
参考资料 [1] <Unity 3D脚本编程 使用C#语言开发跨平台游戏>陈嘉栋著 [2] @张子阳[C#中的委托和事件 - Part.1] http://www.tracefact.ne ...
- ranger-hdfs 插件组权限测试
当hdfs文件对外是公开的则该其他用户就算没有配置相关的权限一样可以进行相关的操作.当hdfs文件对外权限是没有开放的,其他用户若需要进行相关操作则需要通过Ranger进行相关权限的配置. 首先 / ...