Python 的 ProcessPoolExecutor 类


Python 中的 ProcessPoolExecutor 类是 concurrent.futures 模块的一部分,它是一个高级接口,用于使用进程和线程异步执行函数。ProcessPoolExecutor 允许我们使用多个进程并行执行多个函数,这对于受益于并行化过程的 CPU 密集型任务尤其有用。

多进程和多线程

在了解 ProcessPoolExecutor 类之前,我们必须了解多进程和多线程。多进程和多线程是用于实现并行化过程的技术,它们在管理和创建并发任务的方式上有所不同。

多进程使用多个进程来并行执行任务,每个进程都有自己的内存空间,以避免共享内存和并发问题。它也是进程间通信的一种方式,这可能更复杂且成本更高,因为数据必须在进程之间进行序列化和反序列化。多进程尤其用于 CPU 密集型任务,这些任务受益于执行并行化任务,例如数值计算或图像处理等。在 Python 中,我们有一个名为 multiprocessing 的模块,它允许我们创建和管理进程,而 pool 类用于管理工作进程池以并行执行函数。

多线程在一个进程中使用多个线程来实现并行化,每个线程与主线程共享相同的内存空间,这可以简化线程间的通信。这意味着我们在访问共享数据时需要小心,以避免并发问题,例如竞争条件或死锁。多线程用于执行 I/O 密集型任务,这些任务受益于并行化,例如网络编程或文件处理等。在 Python 中,我们有 threading 模块来创建和管理线程,thread 类用于创建新线程并在该线程中执行函数。lock 类用于同步线程之间对共享数据的访问。

创建 ProcessPoolExecutor

创建 ProcessPoolExecutor 的过程类似于 ThreadPoolExecutor,唯一的区别是我们必须从 concurrent.futures 模块导入该类。我们将使用 OS 模块获取当前在我们的池中执行的任务 PID。

示例

from concurrent.futures import ProcessPoolExecutor
import os
def task():
   print("Current executing task PID {}".format(os.getpid()))
if __name__ == '__main__':
   result =[]
   with ProcessPoolExecutor(max_workers=3) as exe:
      result1 = exe.submit(task())

输出

Current executing task PID 6652

示例

from concurrent.futures import ProcessPoolExecutor
import os
values = [10,40,30,4]
def square(x):
   print(f'square of {x}:{x*x}')
   print("Current executing task PID {}".format(os.getpid()))
if __name__ == '__main__':
   result =[]
   with ProcessPoolExecutor(max_workers = 5) as exe:
      for i in values:
         result = exe.submit(square(i))

输出

square of 10:100
Current executing task PID 19276
square of 40:1600
Current executing task PID 19276
square of 30:900
Current executing task PID 19276
square of 4:16
Current executing task PID 19276

更新于:2023年10月19日

116 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告