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