Python 中的多进程

在这里插入图片描述

本文简要而简洁地介绍了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!")

运行结果:

image.png

让我们试着理解上面的代码:

  • 要导入多进程模块,我们需要:

image.png
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()))

运行结果:

image.png

  • 主 python 脚本具有不同的进程 ID,当我们创建进程对象 p1p2 时,多处理模块会生成具有不同进程 ID 的新进程。在上面的程序中,我们使用os.getpid() 函数来获取运行当前目标函数的进程的ID。

    请注意,它与我们使用 Process 类的 pid 属性获取的 p1p2进程 ID 匹配。

  • 每个进程独立运行,并有自己的内存空间。

  • 一旦目标函数的执行完成,进程就会终止。在上面的程序中, 我们使用is_alive方法Process类来检查进程是否仍然处于活动状态。

考虑下图,了解新流程与主要Python脚本的不同之处:

image.png

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佛系的老肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值