Python 多进程池进行并发处理

  • Post category:Python

让我们来详细讲解Python多进程池进行并发处理使用方法的完整攻略。

什么是多进程池?

多进程是Python中并发处理的一种方式,由于Python中的GIL(全局解释器锁)限制了同一时间只能有一个线程访问Python解释器,所以在某些条件下使用多进程会比多线程更高效。多进程池则是多进程的一种高级形式,使用池可以提高进程的效率,而不是在需要时创建新的进程。

使用Python多进程池进行并发处理

  1. 导入multiprocessing库
import multiprocessing
  1. 创建进程池
process_pool = multiprocessing.Pool(processes=4)

这里创建了一个包含4个进程的进程池process_pool。

  1. 将需要处理的任务添加到进程池中
results = []
for i in range(10):
    results.append(process_pool.apply_async(func, args=(i,)))

这里使用process_pool.apply_async()方法将函数func及其参数添加到进程池中,同时将每个任务的执行结果保存在一个列表results中。

  1. 关闭进程池
process_pool.close()

这里用process_pool.close()方法关闭进程池,不再接受新的任务。

  1. 等待所有任务执行完毕
process_pool.join()
  1. 收集处理结果
output = [result.get() for result in results]

示例说明

示例一:计算斐波那契数列

我们可以使用多进程池对斐波那契数列进行并发计算。以下是示例代码:

import multiprocessing

def fib(n):
    if n <= 1:
        return n
    else:
        return fib(n-1) + fib(n-2)

if __name__ == '__main__':
    process_pool = multiprocessing.Pool(processes=4)
    results = []
    for i in range(40):
        results.append(process_pool.apply_async(fib, args=(i,)))
    process_pool.close()
    process_pool.join()
    output = [result.get() for result in results]
    print(output)

在这个示例中,我们首先定义一个递归函数fib(),用于计算斐波那契数列。然后,我们创建一个进程池process_pool,提交40个用于计算斐波那契数列的任务,并使用结果列表results存储结果。最后,我们使用列表推导式将结果提取出来并打印出来。

示例二:并发下载网页

我们可以使用多进程池对多个网页进行并发下载。以下是示例代码:

import multiprocessing
import requests

def download(url):
    response = requests.get(url)
    return response.content

if __name__ == '__main__':
    urls = ['https://www.baidu.com/', 'https://www.google.com/', 'https://www.bing.com/']
    process_pool = multiprocessing.Pool(processes=4)
    results = []
    for url in urls:
        results.append(process_pool.apply_async(download, args=(url,)))
    process_pool.close()
    process_pool.join()
    output = [result.get() for result in results]
    for i, content in enumerate(output):
        with open(f'page_{i}.html', 'wb') as f:
            f.write(content)

在这个示例中,我们首先定义了一个函数download(),用于下载网页。然后,我们创建一个进程池process_pool,并使用apply_async()方法将三个网页下载任务添加到进程池中。最后,我们使用列表推导式将结果提取出来,并将下载的网页内容保存到本地文件中。