本文是对以下内容的简短而简洁的介绍:多处理用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中多处理的简要介绍。接下来的几篇文章将涵盖与多处理相关的以下主题:
- 使用数组, 值和队列在进程之间共享数据。
- 多处理中的锁和池概念
下一个:
- 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课程。