概述
本文简要而简洁地介绍了Python编程语言中的多进程。
什么是多进程?
多进程是指系统同时支持多个处理器的能力。多进程系统中的应用程序被分解为独立运行的较小例程。操作系统将这些线程分配给处理器,以提高系统的性能。
为什么选择多进程?
考虑一个具有单个处理器的计算机系统。如果同时为它分配了多个进程,它将不得不中断每个任务并短暂切换到另一个任务,以保持所有进程的运行。
这种情况就像厨师独自在厨房工作一样。他必须做几项任务,如烘烤,搅拌,揉面团等。
因此,要点是:您必须同时完成的任务越多,跟踪所有任务就越困难,并且保持正确的时机变得更加具有挑战性。
这就是多进程概念出现的地方!
多进程系统可以具有:
- 多处理器,即具有多个中央处理器的计算机。
- 多核处理器,即具有两个或多个独立实际处理单元(称为“内核”)的单个计算组件。
在这里,CPU可以轻松地一次执行多个任务,每个任务都使用自己的处理器。
这就像上一种情况下的厨师在他的助手的协助下一样。现在,他们可以在自己之间分配任务,厨师不需要在他的任务之间切换。
Python中的多进程
在Python中,多进程模块包括一个非常简单直观的API,用于在多个进程之间划分工作。
让我们参考一个使用多处理模块的简单示例:
# 导入多进程模块
import multiprocessing
def print_cube(num):
"""用于打印给定数字的多维数据集的函数"""
print("Cube: {}".format(num * num * num))
def print_square(num):
"""函数打印给定数值的平方"""
print("Square: {}".format(num * num))
if __name__ == "__main__":
# 创建进程
p1 = multiprocessing.Process(target=print_square, args=(10,))
p2 = multiprocessing.Process(target=print_cube, args=(10,))
# 开启进程1
p1.start()
# 开启进程2
p2.start()
# 等待进程1完成
p1.join()
# 等待进程2完成
p2.join()
# 进程任务全部完成
print("Done!")
运行结果:
让我们试着理解上面的代码:
- 要导入多进程模块,我们需要:
import multiprocessing
-
为了创建一个进程,我们创建了一个进程类的对象。它需要以下参数:
- 目标:进程要执行的函数
- args:要传递给目标函数的参数
注意:流程构造函数也采用许多其他参数,稍后将讨论。在上面的例子中,我们创建了2个具有不同目标函数的进程:
p1 = multiprocessing.Process(target=print_square, args=(10, )) p2 = multiprocessing.Process(target=print_cube, args=(10, ))
-
要启动进程,我们使用进程类的启动方法。
p1.start() p2.start()
-
进程启动后,当前程序也会继续执行。为了在进程完成之前停止执行当前程序,我们使用 join 方法。
p1.join() p2.join()
因此,当前程序将首先等待 p1 的完成,然后等待 p2 的完成。一旦它们完成,将执行当前程序的下一个语句。
让我们考虑另一个程序来理解在同一python脚本上运行的不同进程的概念。在下面的示例中,我们打印运行目标函数的进程的 ID:
# 导入多进程模块
import multiprocessing
import os
def worker1():
# 打印进程id
print("ID of process running worker1: {}".format(os.getpid()))
def worker2():
# 打印进程id
print("ID of process running worker2: {}".format(os.getpid()))
if __name__ == "__main__":
# 正在打印主程序进程id
print("ID of main process: {}".format(os.getpid()))
# 创建进程
p1 = multiprocessing.Process(target=worker1)
p2 = multiprocessing.Process(target=worker2)
# 开始进程
p1.start()
p2.start()
# 进程ID
print("ID of process p1: {}".format(p1.pid))
print("ID of process p2: {}".format(p2.pid))
# 等待进程完成
p1.join()
p2.join()
# 两个过程都已完成
print("Both processes finished execution!")
# 检查进程是否处于活动状态
print("Process p1 is alive: {}".format(p1.is_alive()))
print("Process p2 is alive: {}".format(p2.is_alive()))
运行结果:
-
主 python 脚本具有不同的进程 ID,当我们创建进程对象 p1 和 p2 时,多处理模块会生成具有不同进程 ID 的新进程。在上面的程序中,我们使用os.getpid() 函数来获取运行当前目标函数的进程的ID。
请注意,它与我们使用 Process 类的 pid 属性获取的 p1 和 p2 的进程 ID 匹配。
-
每个进程独立运行,并有自己的内存空间。
-
一旦目标函数的执行完成,进程就会终止。在上面的程序中, 我们使用is_alive方法Process类来检查进程是否仍然处于活动状态。
考虑下图,了解新流程与主要Python脚本的不同之处:
最后
以上就是执着电源为你收集整理的Python 中的多进程的全部内容,希望文章能够帮你解决Python 中的多进程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复