和选用线程池来关系多线程类似,当程序中设置到多进程编程时,Python 提供了更好的管理多个进程的方式,就是使用进程池。 进程池可以提供指定数量的进程给用户使用,即当有新的请
进程池可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该请求就会等待,只要池中有进程空闲下来,该请求就能得到执行。
Python multiprocessing 模块提供了 Pool() 函数,专门用来创建一个进程池,该函数的语法格式如下:
multiprocessing.Pool( processes )
其中,processes 参数用于指定该进程池中包含的进程数。如果进程是 None,则默认使用 os.cpu_count() 返回的数字(根据本地的 cpu 个数决定,processes 小于等于本地的 cpu 个数)。注意,Pool() 函数只是用来创建进程池,而 multiprocessing 模块中表示进程池的类是 multiprocessing.pool.Pool 类。该类中提供了一些和操作进程池相关的方法,如表 1 所示。
下面程序演示了进程池的创建和使用。
from multiprocessing import Pool import time import os def action(name='http://c.biancheng.net'): print(name,' --当前进程:',os.getpid()) time.sleep(3) if __name__ == '__main__': #创建包含 4 条进程的进程池 pool = Pool(processes=4) # 将action分3次提交给进程池 pool.apply_async(action) pool.apply_async(action, args=('http://c.biancheng.net/python/', )) pool.apply_async(action, args=('http://c.biancheng.net/java/', )) pool.apply_async(action, kwds={'name': 'http://c.biancheng.net/shell/'}) pool.close() pool.join()程序执行结果为:
http://c.biancheng.net --当前进程: 14396
http://c.biancheng.net/python/ --当前进程: 5432
http://c.biancheng.net/java/ --当前进程: 11080
http://c.biancheng.net/shell/ --当前进程: 10944
除此之外,我们可以使用 with 语句来管理进程池,这意味着我们无需手动调用 close() 方法关闭进程池。例如:
from multiprocessing import Pool import time import os def action(name='http://c.biancheng.net'): time.sleep(3) return (name+' --当前进程:%d'%os.getpid()) if __name__ == '__main__': #创建包含 4 条进程的进程池 with Pool(processes=4) as pool: adds = pool.map(action, ('http://c.biancheng.net/python/', 'http://c.biancheng.net/java/', 'http://c.biancheng.net/shell/')) for arc in adds: print(arc)程序执行结果为:
http://c.biancheng.net/python/ --当前进程:24464
http://c.biancheng.net/java/ --当前进程:22900
http://c.biancheng.net/shell/ --当前进程:23324