Python 多进程池进行并发处理

  • Post category:Python

下面是使用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

可以看到,多进程池并发处理的效果非常显著,可以大大缩短处理时间。同时,由于每个进程独立处理一个任务,因此多进程并发处理可以很好地避免线程同步和资源竞争问题。