一、进程池简介
1、定义
在python中定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。
2、为何要使用进程池
在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用 multiprocessing 中的 Process 动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。
二、使用进程池
在 Python 中的 multiprocessing 模块提供了 Pool 类,专门用来实例化一个进程池。
1、语法格式
Pool([numprocess [,initializer [, initargs]]]):创建进程池
参数解释:
1、numprocess:要创建的进程数,如果省略,则默认使用 os.cpu_count() 返回的数字(根据本地的 cpu 个数决定,processes 小于等于本地的 cpu 个数)。
2、initializer:每个工作进程启动时要执行的可调用对象,默认为None。
3、initargs:要传给 initialize r的参数组。
2、方法介绍
方法名 | 功能 |
---|---|
apply( func[, args[, kwds]] ) | 将 func 函数提交给进程池处理。其中 args 代表传给 func 的位置参数,kwds 代表传给 func 的关键字参数。该方法会被阻塞直到 func 函数执行完成。 |
apply_async( func[, args[, kwds[, callback[, error_callback]]]] ) | 这是 apply() 方法的异步版本,该方法不会被阻塞。其中 callback 指定 func 函数完成后的回调函数,error_callback 指定 func 函数出错后的回调函数。 |
map( func, iterable[, chunksize] ) | 类似于 Python 的 map() 全局函数,只不过此处使用新进程对 iterable 的每一个元素执行 func 函数。 |
map_async( func, iterable[, chunksize[, callback[, error_callback]]] ) | 这是 map() 方法的异步版本,该方法不会被阻塞。其中 callback 指定 func 函数完成后的回调函数,error_callback 指定 func 函数出错后的回调函数。 |
imap( func, iterable[, chunksize] ) | 这是 map() 方法的延迟版本。 |
imap_unordered( func, iterable[, chunksize] ) | 功能类似于 imap() 方法,但该方法不能保证所生成的结果(包含多个元素)与原 iterable 中的元素顺序一致。 |
starmap( func, iterable[,chunksize] ) | 功能类似于 map() 方法,但该方法要求 iterable 的元素也是 itera |