下面是使用Python多进程池进行并发处理的完整攻略。
什么是多进程池?
多进程池就是一种在多进程环境下使用的并发处理方式,其中一个进程被称为主进程,它将任务分配给多个子进程,由子进程来完成具体的处理任务,主进程负责收集结果返回给用户。
多进程池的使用可以大大提高多核CPU的利用率,从而加速处理速度。
Python多进程池的使用方法
Python提供了multiprocessing模块来支持多进程池并发处理。我们可以通过以下简单的步骤使用多进程池来实现并发处理。
1. 导入模块
import multiprocessing
2. 创建进程池对象
pool = multiprocessing.Pool(processes=4)
其中,processes参数表示创建的进程数量。这里创建了一个进程池对象pool,并设置了进程数量为4。
3. 定义任务函数
def task(param):
# 处理任务代码
return result
任务函数task表示我们要并发处理的具体任务,它的参数param可以根据具体需求自定义,返回值result为处理结果。
4. 启动多进程池
results = []
for param in params:
result = pool.apply_async(task, (param,))
results.append(result)
这里,params表示需要处理的参数列表,我们通过循环遍历每个参数param,并使用apply_async方法提交任务到进程池中处理。结果results为一个结果列表,其中每个结果都是一个进程对象。
5. 收集结果
for result in results:
result.wait()
print(result.get())
这里我们通过循环遍历所有结果对象,在每个结果对象上调用wait方法等待任务执行完成,然后调用get方法获取任务执行结果。
6. 关闭进程池
pool.close()
pool.join()
最后需要执行close和join方法关闭进程池,以便清理资源。
示例1:使用多进程池并行处理列表元素求平方根
import multiprocessing
import math
def sqrt(x):
return math.sqrt(x)
if __name__ == '__main__':
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pool = multiprocessing.Pool(processes=4)
results = []
for num in nums:
result = pool.apply_async(sqrt, (num,))
results.append(result)
for result in results:
result.wait()
print(result.get())
pool.close()
pool.join()
在这个示例中,我们定义了一个求平方根的函数sqrt,将其作为任务函数,将列表nums中的每个元素作为输入参数并提交到多进程池中处理。执行结果如下:
1.0
1.4142135623730951
1.7320508075688772
2.0
2.23606797749979
2.449489742783178
2.6457513110645907
2.8284271247461903
3.0
3.1622776601683795
可以看到,多进程池并发处理的效果非常显著,可以大大缩短处理时间。
示例2:通过多进程池并行处理下载多个图片
import multiprocessing
import requests
import os
def download_image(url):
r = requests.get(url, allow_redirects=True)
filename = url.rsplit('/', 1)[1]
open(filename, 'wb').write(r.content)
print('Downloaded', filename)
if __name__ == '__main__':
urls = [
'https://cdn.pixabay.com/photo/2020/06/17/14/35/sun-5301822_960_720.jpg',
'https://cdn.pixabay.com/photo/2020/07/31/11/06/flowers-5458449_960_720.jpg',
'https://cdn.pixabay.com/photo/2020/08/25/06/36/landscape-5511767_960_720.jpg',
'https://cdn.pixabay.com/photo/2020/09/04/15/05/lighthouse-5542996_960_720.jpg',
'https://cdn.pixabay.com/photo/2018/06/05/17/59/panorama-3457354_960_720.jpg'
]
pool = multiprocessing.Pool(processes=4)
results = []
for url in urls:
result = pool.apply_async(download_image, (url,))
results.append(result)
for result in results:
result.wait()
pool.close()
pool.join()
在这个示例中,我们定义了一个下载图片的函数download_image,将多个图片的URL作为参数列表urls,将每个URL作为输入参数并提交到多进程池中处理。
执行结果如下:
Downloaded sun-5301822_960_720.jpg
Downloaded flowers-5458449_960_720.jpg
Downloaded landscape-5511767_960_720.jpg
Downloaded lighthouse-5542996_960_720.jpg
Downloaded panorama-3457354_960_720.jpg
可以看到,多进程池并发处理的效果非常显著,可以大大缩短处理时间。同时,由于每个进程独立处理一个任务,因此多进程并发处理可以很好地避免线程同步和资源竞争问题。