现在,大多数 CPU 制造商都在创建多核 CPU。连手机都带多个内核!Python 线程不能使用这些内核,因为全局解释器锁定。从 Python 2.6 开始 multiprocessing ,添加了模块,让您充分利用计算机上的所有内核。

在这篇文章中,您将了解以下主题:

  • 使用流程的优点
  • 使用流程的缺点
  • 创建流程multiprocessing
  • 子分类Process
  • 创建流程池

本文不是多处理的全面概述。多处理和并发一般的主题更适合在它自己的书。如果需要,您始终可以 multiprocessing 查看模块的文档:

现在,让我们开始吧!

使用流程的优点

使用流程有几个优点:

  • 进程使用单独的内存空间
  • 与线程相比,代码可以更直接
  • 使用多个 CPU/内核
  • 避免全局解释器锁 (GIL)
  • 子进程可以被杀死(与线程不同)
  • multiprocessing该模块的接口类似于threading.Thread
  • 适合 CPU 绑定处理(加密、二进制搜索、矩阵乘法)

现在,让我们来看看流程的一些缺点!

使用流程的缺点

使用流程也有几个缺点:

  • 进程间通信更为复杂
  • 内存占用量大于线程

现在,让我们学习如何使用 Python 创建流程!

创建流程multiprocessing

multiprocessing该模块旨在模拟类 threading.Thread 的工作方式。

下面是使用模块 multiprocessing 的示例:

Python

 

18
1
导入多处理
2
导入随机
3
导入时间
4
def辅助工作名称str->
打印(f’启动工作人员 [名称])

6
worker_time随机的。选择范围15))
7
时间睡眠worker_time
8
打印f'[名称] 工作人员完成在 [worker_time] 秒)
9
如果__name____name__"__main__":
10
流程|
11
i范围range5):
过程=多处理过程目标=工作人员

13
args=(f'computer_[i]',))
14
进程附加过程
15
过程开始()
16
        
17
用于流程中的procprocesses
18
proc.加入()
过程 = 多处理过程目标=工作人员

第一步是导入 multiprocessing 模块。其他两个导入分别用于 randomtime 模块。

然后你有愚蠢的 worker() 功能, 假装做一些工作。它接受 和 name 返回什么。在 worker() 函数内部,它将打印出工作 name 线程,然后用于模拟 time.sleep() 执行一些长时间运行的过程。最后,它将打印出来,它已经完成了。

代码段的最后一部分是创建 5 个工作进程的地方。使用 的工作方式与 大致相同 multiprocessing.Process() threading.Thread() 。您可以 Process 告诉要使用的目标函数以及要传递给它哪些参数。主要区别在于,这次您创建一个 list 流程。对于每个进程,调用其 start() 方法以启动该进程。

最后,您循环查看进程列表并调用其 join() 方法,该方法告诉 Python 等待进程终止。

运行此代码时,将看到类似于以下内容的输出:

Python

 

x
1
10
1
启动computer_2computer_2
2
computer_22finishedin秒内完成
3
启动computer_1computer_1
4
computer_1worker3in秒内完成
5
启动工人computer_3
6
computer_3worker3in秒内完成
开始工作computer_0

8
computer_0worker4in秒内完成
9
启动工人computer_4
10
computer_44finishedin秒内完成

每次运行脚本时,由于模块,输出会略有不同 random 。试一试,自己看看!

子分类Process

Process模块中的 multiprocessing 类也可以进行子类。它的工作方式与类大致相同 threading.Thread

让我们来看看:

Python

 

X
1
26
1
* worker_thread_subclass. py
2
随机导入
3

4
导入时间
5
辅助进程多进程)。过程):
6
def__init__):
7
多处理过程__init__自我
8
自我名称名称
9
def运行自我):
10
"""
运行线程

12
  """
13
工人自我名称
14
def辅助工作名称str->
15
打印f'启动辅助工 [名称])
16
worker_time随机的。选择范围15))
17
时间睡眠worker_time
打印(f'[name] 工作人员完成在 [worker_time] 秒)

19
如果__name____name__"__main__":
20
流程|
21
i范围range5):
22
进程工作进程名称=f 'computer_ [i]'
23
进程附加过程
24
过程开始()
25

26
过程加入()

在这里,您可以子 multiprocess.Process() 类并重写其 run() 方法。

接下来,在代码末尾的循环中创建进程,并将其添加到进程列表中。然后,要使进程正常工作,您需要循环查看进程列表并调用 join() 每个进程。这与上一节中上一个流程示例中的工作方式完全相同。

此类的输出还应与上一节的输出非常相似。

创建流程池

如果运行大量进程,有时您需要限制一次运行的进程数。例如,假设您需要运行 20 个进程,但您只有 4 个内核的处理器。您可以使用该模块 multiprocessing 创建一个进程池,该进程池将一次运行的进程数限制为仅 4 个。

以下是如何做到这一点:

Python

 

x
1
13