Python如何理解多处理?简介和用法指南|S1

2021年3月29日14:27:14 发表评论 992 次浏览

本文是对以下内容的简短而简洁的介绍:多处理用Python编程语言编写。

什么是多处理?

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

为什么要进行多处理?

考虑具有单个处理器的计算机系统。如果同时为它分配了多个进程, 则必须中断每个任务并短暂切换到另一个任务, 以使所有进程继续进行。

这种情况就像一个厨师独自在厨房工作。他必须完成多个任务, 例如烘烤, 搅拌, 揉面团等。

因此, 要旨是:你一次必须执行的任务越多, 跟踪所有任务的难度就越大, 而保持正确的时间安排就变得更具挑战性。

这就是多处理概念出现的地方!

多处理系统可以具有:

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

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

就像最后一种情况的厨师在助手的协助下一样。现在, 他们可以将任务分配给自己, 而厨师无需在任务之间切换。

Python中的多处理

在Python中,multiprocessing模块包括一个非常简单和直观的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

为了创建一个进程,我们创建一个进程类的对象。它需要以下参数:

  • target:要由进程执行的功能
  • args:要传递给目标函数的参数

注意:处理构造函数还接受许多其他参数, 这将在后面讨论。在上面的示例中, 我们创建了两个具有不同目标功能的进程:

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, 并且在我们创建时, 多处理模块会生成具有不同进程ID的新进程处理对象p1和p2。在上面的程序中, 我们使用os.getpid()函数获取运行当前目标函数的进程的ID。

    请注意, 它与以下进程的ID匹配p1和p2我们使用pid的属性处理类。

  • 每个进程独立运行, 并具有自己的内存空间。
  • 目标函数的执行完成后, 进程将终止。在上面的程序中, 我们使用了活着的方法处理类, 用于检查进程是否仍处于活动状态。

考虑下图, 以了解新过程与主要Python脚本有何不同:

Python如何理解多处理?简介和用法指南|S11

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

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

下一个:

  • Python中的多处理|S2
  • Python中进程的同步和池化

参考文献:

  • http://learn.parallax.com/tutorials/language/blocklyprop/blocklyprop-functions-and-multicore/bit-about-multicore
  • https://docs.python.org/3/library/multiprocessing.html

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: