当我们需要同时执行多个任务时,使用多进程技术可以提高处理效率。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使用多进程池和任务的完整攻略,通过上述代码可实现多任务并发处理。