Python 多进程池是一种并发处理方式,可以在处理IO密集型任务时提高程序的效率。使用多进程池,可以同时调用多个进程处理任务。以下是Python多进程池进行并发处理的使用方法。
建立多进程池
使用Python的内置模块multiprocessing,可以轻松地创建多进程池。在开始处理任务之前,需要建立一个多进程池。
from multiprocessing import Pool
# 创建多进程池,括号内为最大进程数
pool = Pool(4)
使用多进程池处理任务
将需要处理的任务传入多进程池中。使用apply_async函数进行非阻塞式调用,或使用map函数进行阻塞式调用。
非阻塞式调用
def func(num):
# 处理任务的函数,这里简单示范打印数字
print(num)
if __name__ == '__main__':
# 建立多进程池
pool = Pool(4)
# 传入任务,使用非阻塞式调用
for i in range(10):
pool.apply_async(func, args=(i,))
# 关闭多进程池
pool.close()
# 等待所有任务完成
pool.join()
阻塞式调用
def func(num):
# 处理任务的函数,这里简单示范返回数字的平方
return num*num
if __name__ == '__main__':
# 建立多进程池
pool = Pool(4)
# 传入任务,使用阻塞式调用
res = pool.map(func, range(10))
# 关闭多进程池
pool.close()
# 输出结果
print(res)
在以上示例中,建立了一个含有4个进程的多进程池。使用apply_async函数传入10个任务并打印数字或使用map函数传入10个任务并返回平方数组成的列表。
主进程与子进程的交互
多进程池中的子进程是独立的进程,无法访问主进程中的变量。需要使用Queue通信队列将数据从主进程传入子进程,或从子进程中取回结果。
from multiprocessing import Process, Queue
def func(q):
# 处理任务的函数,这里示范从队列中取出数据,并将平方值返回队列中
while True:
num = q.get()
if num is None:
break
res = num*num
q.put(res)
if __name__ == '__main__':
# 建立通信队列
q = Queue()
# 建立子进程
p = Process(target=func, args=(q,))
p.start()
# 传入任务
for i in range(10):
q.put(i)
# 发送完成信号
q.put(None)
# 取回结果
res = []
while True:
r = q.get()
if r is None:
break
res.append(r)
# 关闭子进程
p.join()
# 输出结果
print(res)
在以上示例中,建立了一个通信队列,并在子进程中处理从队列中获取的任务,并将结果返回队列中。在主进程中将任务传入队列,并从队列中取回结果并组成列表。最后关闭子进程并输出结果。
以上为使用Python多进程池进行并发处理的完整攻略,包含了建立进程池、处理任务、主进程与子进程的交互等过程的示例说明。