使用 multiprocessing.Pool
可以在 Python 中方便的进行多进程处理。下面是完整的攻略:
什么是 multiprocessing.Pool?
multiprocessing.Pool 是 Python 中的一个标准模块,可用于在多个进程之间分配可执行的任务。 Pool
提供了一种使用简单的接口,用于实现并行执行计算密集型或 I/O 密集型任务的策略。它通常可以显著提高程序的性能。
如何使用 multiprocessing.Pool?
使用 multiprocessing.Pool
中的方法和使用线程池中的方法类似。使用以下步骤来使用 Pool
:
- 导入
Pool
类和必要的模块,例如time
或导入其他依赖项。
import multiprocessing
import time
- 定义你所需的任务,并将它们提交到
Pool
, 使其以并发的方式处理。
def f(x):
return x * x
def main():
with multiprocessing.Pool(5) as p:
print(p.map(f, [1, 2, 3]))
Pool 的参数
Pool
的构造函数接受两个可选参数: processes
和 initializer
。 processes
指定从 Pool
中使用的进程数。 initializer
是一个可选函数,将在每个 子进程
开始运行时调用。
Pool 的示例
示例一:多进程下载
在一个目录里有许多图片需要下载,使用单进程下载会浪费很多时间,是很慢的,使用多进程就可以加速下载。
import requests
import multiprocessing
def download_link(link):
filename = link.split("/")[-1]
response = requests.get(link)
with open(filename, "wb") as f:
f.write(response.content)
print(f"{filename} downloaded")
def download_all(links):
with multiprocessing.Pool(5) as p:
p.map(download_link, links)
if __name__ == "__main__":
links = ["https://www.example.com/image{}.jpg".format(i) for i in range(1,11)]
download_all(links)
在此例中,我们定义了 download_link
函数来下载一个链接,然后 def download_all 函数来并发下载链接,这使用了 multiprocessing.Pool。
示例二:多进程计算
这个例子说明了如何用多个 Python 进程来处理 CPU 密集型任务。
在此示例中,我们将使用质数生成器来生成质数。
import time
import multiprocessing
def is_prime(n):
if n <= 1:
return False
else:
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def calculate_primes_range(start, end):
primes = []
for n in range(start, end):
if is_prime(n):
primes.append(n)
return primes
def generate_primes(maximum):
partitions = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=partitions)
limit = maximum // partitions + 1
tasks = [(i * limit, (i + 1) * limit) for i in range(partitions)]
result = []
for start, end in tasks:
result.append(pool.apply_async(calculate_primes_range, (start, end,)))
pool.close()
pool.join()
primes = []
for res in result:
primes.extend(res.get())
return primes
if __name__ == "__main__":
start = time.time()
primes = generate_primes(1000000) # 生成100万以内的质数
print(f"耗时:{time.time()-start:.2f}秒")
此示例中,我们定义了一个函数 generate_primes
,该函数使用池来使用 calculate_primes_range
函数计算质数范围。 最后,我们使用 1,000,000 作为最大值来生成质数列表。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在 Python 中利用Pool 进行多处理 - Python技术站