Python 使用多进程池和任务

  • Post category:Python

当我们需要同时执行多个任务时,使用多进程技术可以提高处理效率。Python中,多进程池是一种维护一定数量的进程,用来应对高并发请求的方法。下面介绍Python使用多进程池和任务的完整攻略。

创建进程池

Python中,multiprocessing模块提供了进程池类Pool()。要创建进程池,需要通过Pool()对象定义一个包含多少个进程的进程池。结合上下文管理器的with语句,我们将每个进程池的实例化与任务的管理分离。下面是创建进程池的代码示例:

from multiprocessing import Pool

def process(num):
    print("Process: {}".format(num))

if __name__ == '__main__':
    with Pool(processes=3) as pool:
        pool.map(process, range(10))

这段代码创建了一个包含3个进程的进程池,并用map函数执行了10个进程。运行上述代码,输出结果应该如下:

Process: 0
Process: 1
Process: 2
Process: 3
Process: 4
Process: 5
Process: 6
Process: 7
Process: 8
Process: 9

分配任务

接下来,我们需要分配任务给每个子进程进行处理。一般使用map、imap、imap_unordered函数来实现。这些函数接受一个函数和一个可迭代对象作为参数,函数会并发地运行在进程池中,给每个进程分配一个可迭代对象中的元素。下面是分配任务的代码示例:

from multiprocessing import Pool

def process(num):
    print("Process: {}".format(num))
    return num

if __name__ == '__main__':
    with Pool(processes=3) as pool:
        results = pool.map(process, range(10))
        print(results)

这段代码创建了一个包含3个进程的进程池,并用map函数执行了10个进程。函数process()并发地运行在3个进程中,打印出每个进程的数字,并返回结果列表。执行结果如下:

Process: 0
Process: 1
Process: 2
Process: 3
Process: 4
Process: 5
Process: 6
Process: 7
Process: 8
Process: 9
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

示例1:并发下载图片

下面是一个示例,使用Python的多进程池实现并发下载图片。我们可以从网站上下载一个zip包,解压得到多个图片文件。通过Python并发地处理下载任务,可以极大地提高下载速度。具体代码如下:

import requests
import os
from multiprocessing import Pool

def download(url):
    response = requests.get(url, stream=True)
    filename = os.path.basename(url)
    with open(filename, 'wb') as f:
        for chunk in response.iter_content(1024):
            f.write(chunk)

if __name__ == '__main__':
    urls = [
        'http://img1.gtimg.com/ninja/2/2018/08/ninja153489968613595.jpg',
        'http://img1.gtimg.com/ninja/2/2018/08/ninja153489968416226.jpg',
        'http://img1.gtimg.com/ninja/2/2018/08/ninja153489968214942.jpg',
        'http://img1.gtimg.com/ninja/2/2018/08/ninja153489968020985.jpg',
        'http://img1.gtimg.com/ninja/2/2018/08/ninja153489967821193.jpg',
        'http://img1.gtimg.com/ninja/2/2018/08/ninja153489967627585.jpg',
        'http://img1.gtimg.com/ninja/2/2018/08/ninja153489967426029.jpg',
        'http://img1.gtimg.com/ninja/2/2018/08/ninja153489967223744.jpg',
    ]

    with Pool(processes=4) as pool:
        pool.map(download, urls)

上述代码创建一个进程池,使用map函数并发地执行下载函数,最多同时下载4个文件。下载的文件保存在当前目录中。

示例2:并发计算斐波那契数列

斐波那契数列是指:1、1、2、3、5、8、13、21、34、……。每个数都是它前面两个数的和。下面是使用多进程池计算斐波那契数列的实例代码:

from multiprocessing import Pool

def fibonacci(num):
    if num <= 1:
        return 1
    else:
        return fibonacci(num-1) + fibonacci(num-2)

if __name__ == '__main__':
    with Pool(processes=4) as pool:
        results = pool.map(fibonacci, range(30))
        print(results)

上述代码运用了斐波那契数列的递归算法,并使用多进程池计算斐波那契数列中的每个数字。将进程数定义为4,上述代码将并发地生成斐波那契数列。最后输出所有生成数字的列表。

以上就是Python使用多进程池和任务的完整攻略,通过上述代码可实现多任务并发处理。