📜  Python中的多处理 |第 1 套(介绍)

📅  最后修改于: 2022-05-13 01:54:55.492000             🧑  作者: Mango

Python中的多处理 |第 1 套(介绍)

本文简要介绍了Python编程语言中的多处理

什么是多处理?

多处理是指系统同时支持多个处理器的能力。多处理系统中的应用程序被分解为独立运行的较小例程。操作系统将这些线程分配给提高系统性能的处理器。

为什么要多处理?

考虑具有单个处理器的计算机系统。如果它同时被分配了几个进程,它将不得不中断每个任务并短暂地切换到另一个,以保持所有进程的运行。
这种情况就像厨师独自在厨房工作一样。他必须做一些任务,比如烘烤、搅拌、揉面团等。

所以要点是:你必须一次完成的任务越多,跟踪它们就越困难,而保持正确的时间变得更具挑战性。
这就是多处理的概念出现的地方!
多处理系统可以具有:

  • 多处理器,即具有多个中央处理器的计算机。
  • 多核处理器,即具有两个或多个独立实际处理单元(称为“核”)的单个计算组件。

在这里,CPU 可以轻松地一次执行多个任务,每个任务都使用自己的处理器。

就好像最后的厨师得到助手的协助一样。现在,他们可以在自己之间分配任务,厨师不需要在他的任务之间切换。

Python中的多处理

在Python中,多处理模块包含一个非常简单直观的 API,用于在多个进程之间划分工作。
让我们考虑一个使用多处理模块的简单示例:

# importing the multiprocessing module
import multiprocessing
  
def print_cube(num):
    """
    function to print cube of given num
    """
    print("Cube: {}".format(num * num * num))
  
def print_square(num):
    """
    function to print square of given num
    """
    print("Square: {}".format(num * num))
  
if __name__ == "__main__":
    # creating processes
    p1 = multiprocessing.Process(target=print_square, args=(10, ))
    p2 = multiprocessing.Process(target=print_cube, args=(10, ))
  
    # starting process 1
    p1.start()
    # starting process 2
    p2.start()
  
    # wait until process 1 is finished
    p1.join()
    # wait until process 2 is finished
    p2.join()
  
    # both processes finished
    print("Done!")
Square: 100
Cube: 1000
Done!

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

  • 要导入多处理模块,我们执行以下操作:
    import multiprocessing
    
  • 为了创建一个进程,我们创建一个Process类的对象。它需要以下参数:
    • target : 进程要执行的函数
    • args :要传递给目标函数的参数

    注意:流程构造函数还有许多其他参数,稍后将讨论。在上面的示例中,我们创建了 2 个具有不同目标函数的进程:

    p1 = multiprocessing.Process(target=print_square, args=(10, ))
    p2 = multiprocessing.Process(target=print_cube, args=(10, ))
    
  • 要启动一个进程,我们使用Process类的start方法。
    p1.start()
    p2.start()
    
  • 一旦进程开始,当前程序也会继续执行。为了在进程完成之前停止当前程序的执行,我们使用join方法。
    p1.join()
    p2.join()
    

    结果,当前程序将首先等待p1的完成,然后是p2 。一旦它们完成,则执行当前程序的下一条语句。

让我们考虑另一个程序来理解在同一个Python脚本上运行的不同进程的概念。在下面的示例中,我们打印运行目标函数的进程的 ID:

# importing the multiprocessing module
import multiprocessing
import os
  
def worker1():
    # printing process id
    print("ID of process running worker1: {}".format(os.getpid()))
  
def worker2():
    # printing process id
    print("ID of process running worker2: {}".format(os.getpid()))
  
if __name__ == "__main__":
    # printing main program process id
    print("ID of main process: {}".format(os.getpid()))
  
    # creating processes
    p1 = multiprocessing.Process(target=worker1)
    p2 = multiprocessing.Process(target=worker2)
  
    # starting processes
    p1.start()
    p2.start()
  
    # process IDs
    print("ID of process p1: {}".format(p1.pid))
    print("ID of process p2: {}".format(p2.pid))
  
    # wait until processes are finished
    p1.join()
    p2.join()
  
    # both processes finished
    print("Both processes finished execution!")
  
    # check if processes are alive
    print("Process p1 is alive: {}".format(p1.is_alive()))
    print("Process p2 is alive: {}".format(p2.is_alive()))
ID of main process: 28628
ID of process running worker1: 29305
ID of process running worker2: 29306
ID of process p1: 29305
ID of process p2: 29306
Both processes finished execution!
Process p1 is alive: False
Process p2 is alive: False
  • 主Python脚本具有不同的进程 ID,当我们创建Process对象p1p2时,多处理模块会产生具有不同进程 ID 的新进程。在上面的程序中,我们使用os.getpid()函数来获取运行当前目标函数的进程 ID。

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

  • 每个进程独立运行并拥有自己的内存空间。
  • 一旦目标函数的执行完成,进程就会终止。在上面的程序中,我们使用Process类的is_alive方法来检查进程是否仍然处于活动状态。

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

因此,这是对Python中的多处理的简要介绍。接下来的几篇文章将涵盖以下与多处理相关的主题:

  • 使用数组、值和队列在进程之间共享数据。
  • 多处理中的锁和池概念

下一个:

  • Python中的多处理 |设置 2
  • Python中进程的同步和池化

参考:

  • http://learn.parallax.com/tutorials/language/blocklyprop/blocklyprop-functions-and-multicore/bit-about-multicore
  • https://文档。 Python.org/3/library/multiprocessing.html