进程池可以提供指定数量的进程给用户使用,当有新的请求提交到进程池中时,如果进程池未满,则会创建一个新的进程执行该请求;如果进程池中的进程数已经达到了设置的最大值,那么该请求就会等待,等进程池中有进程空余下来就会执行该任务
Python multiprocessing 模块提供了 Pool() 函数,专门用来创建一个进程池
multiprocessing 模块中表示进程池的类是 multiprocessing.pool.Pool 类。该类中提供了一些和操作进程池相关的方法
- apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
- apply(func[, args[, kwds]]):使用阻塞方式调用func
- close():关闭Pool,使其不再接受新的任务;
- terminate():不管任务是否完成,立即终止;
- join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;
multiprocessing.Pool( processes )
process参数用于指定进程池中包含的进程数,如果为None则默认使用os.cpu_count()返回的数字(根据本地CPU个数决定,process小于等于本地的cpu个数)
from multiprocessing import Pool
import time
import os
def test(arg='jibu'):
print(arg,' --当前进程:',os.getpid())
time.sleep(3)
if __name__ == '__main__':
#创建包含 4 条进程的进程池
pool = Pool(processes=4)
# 将action分3次提交给进程池
pool.apply_async(test)
pool.apply_async(test, args=('jibu', ))
pool.apply_async(test, args=('jibu', ))
pool.apply_async(test, kwds={'arg': 'jibu'})
pool.close() #关闭进程池,关闭后po不再接收新的请求
# 等待po中所有子进程执行完成,必须放在close语句之后
pool.join()
结果
jibu --当前进程: 7508
jibu --当前进程: 12392
jibu --当前进程: 2876
jibu --当前进程: 13360
我们也可以使用 with 语句来管理进程池,这样的话我们无需手动调用 close() 方法关闭进程池
from multiprocessing import Pool
import time
import os
def test(arg='jibu'):
print(arg,' --当前进程:',os.getpid())
time.sleep(3)
if __name__ == '__main__':
with Pool(processes=4) as pool:
result = pool.map(test, ('jibu', 'zhangsan', 'lisi'))
for arc in result:
print(arc)
结果
jibu --当前进程: 3444
zhangsan --当前进程: 8500
lisi --当前进程: 12708
None
None
None