Python中的多处理与并行编程

多处理是为了特定目的从单个进程创建、运行、结束多个进程和线程。Python编程语言提供了许多不同的多处理特性。

null

多处理功能

多处理为程序或应用程序开发人员提供了许多特性。我们将列出下面的一些。

  • Performance 是多处理最流行的特性。单个流程任务可以分为多个,每个流程可以更快地完成。最终,完成的任务将在更短的时间内完成。
  • Reliability 提供的是创建简单的tas块,甚至有些块损坏了,我们可以创建一个小的任务块,其他块不干涉。
  • Efficiency 是通过使用所有CPU源来完成的,比如线程或多个CPU。现代的CPU提供了多个处理单元和线程来同时运行多个进程。通过多重处理,我们可以有效地利用这些资源。

导入多处理模块/库

Python通过 multiprocessing 模块。因此,为了使用多处理功能和能力,我们必须导入 multiprocessing 模块如下。

import multiprocessing
Import Multiprocessing Module/Library
导入多处理模块/库

我们也可以看到 multiprocessing 模块提供 process 以及类似的功能。

生成多个进程

我们将从一个简单的流程spawn或create开始,它将使用 Process() 功能。 Process() 函数基本上需要两个参数,其中我们需要指定新创建的函数将在其中运行的函数名。此外,我们还可以提供一些参数 args 设置如下。

import multiprocessingdef foo(message):    print(message)if __name__ == '__main__':    p = multiprocessing.Process(target=foo, args=("This is a spawn",))    p.start()    p = multiprocessing.Process(target=foo, args=("This is a spawn 2",))    p.start()    p = multiprocessing.Process(target=foo, args=("This is a spawn 3",))    p.start()
Spawn Multiple Processes
生成多个进程

我们可以看到,我们已经创建了3个进程来生成 start() 是我们开始的。我们不能多次启动一个新流程,因此必须使用 Process() 功能如上所述。

相关文章: Linux ps命令教程

为创建的进程设置名称

多处理提供了不同的有用功能,例如为新进程设置名称。我们将使用 name 将提供给 Process() 功能。我们可以使用 multiprocessing.current_process().name 属性如下。

import multiprocessingdef daemon(message):    print(multiprocessing.current_process().name)    print(message)if __name__ == '__main__':    p = multiprocessing.Process(name="This process name is daemon", target=daemon, args=("This is a spawn",))    p.start()
Set Name For Created Processes
为创建的进程设置名称

创建守护进程

当正常创建或派生的进程完成其执行时,其结束。这是所有正常进程的正常行为。但在某些特殊情况下,我们需要运行一个进程,比如守护进程或服务,即使没有任务要完成,它们也不会停止。守护进程主要是等待一个特定的事件比如连接,触发一些事件来运行。Python多处理提供了 daemon 选项,该选项将给定的进程转换为将永远正常运行的守护进程。但是如果主进程完成,守护进程也会兴奋起来。

import multiprocessingdef daemon(message):    print(message)if __name__ == '__main__':    p = multiprocessing.Process(target=daemon, args=("Waiting For Tasks",))    p.daemon = True    p.start()    print("This will not printed bec")

等待进程完成

主进程结束后,进程将退出,所有子进程将停止。但是我们可以改变这种行为,即主进程将等待子进程完成并退出。我们将使用 join() 函数,指定的子进程出口将由主进程等待。

import multiprocessingdef daemon(message):print(message)if __name__ == '__main__':    p = multiprocessing.Process(target=daemon, args=("Waiting For Tasks",))    p.daemon = True    p.start()    p.join()    print("This will not printed bec")

终止进程

创建新的子进程后,它将在任务完成后退出。但在某些情况下,我们可能需要在给定的子进程完成之前终止它。我们可以用 terminate() 终止给定进程的函数。

import multiprocessingdef daemon(message):    print(message)if __name__ == '__main__':    p = multiprocessing.Process(target=daemon, args=("Waiting For Tasks",))        p.daemon = True        p.start()        p.terminate()        print("Process Is Terminated")

检查给定的子进程是否正在运行或处于活动状态

创建子进程后,它将根据其任务或是否是守护进程运行。在当前情况下,我们可能需要此进程,无论它是从主进程运行还是处于活动状态。我们将使用 is_alive() 函数,它将根据子进程的情况返回布尔值True或False。

import multiprocessingdef daemon(message):    print(message)if __name__ == '__main__':    p = multiprocessing.Process(target=daemon, args=("Waiting For Tasks",))    p.daemon = True    p.start()    print(p.is_alive())

打印进程退出状态

进程执行、完成和退出。但对于不同的退出案例,这个过程会有一些退出或结束的原因。例如,一个进程可以退出,因为它被终止或者它成功地完成了它的执行。  我们可以使用 exitcode 属性。

import multiprocessingimport timedef foo(message):    print(message)if __name__ == '__main__':    p1 = multiprocessing.Process(target=foo, args=("Waiting For Tasks",))    p2 = multiprocessing.Process(target=foo, args=("Waiting For Tasks",))    p1.start()    p2.start()    p2.terminate()    time.sleep(3)    print(p1.exitcode)    print(p2.exitcode)
Print Process Exit Status
打印进程退出状态

退出状态是有意义的。

  • 如果等于0,则进程将成功执行并完成,没有任何错误。
  • 如果大于0,则与代码相关的错误。
  • 如果低于0,则用信号终止进程。

相关文章: Windows任务管理器教程

记录多进程操作

每个创建的进程都有一些日志机制。我们可以使用 log_to_stferr(logging.DEBUG) 通过指定日志详细程度 DEBUG 在这种情况下。

def foo(message):    print(message)if __name__ == '__main__':    multiprocessing.log_to_stderr(logging.DEBUG)    p1 = multiprocessing.Process(target=foo, args=("Waiting For Tasks",))    p2 = multiprocessing.Process(target=foo, args=("Waiting For Tasks",))    p1.start()    p2.start()    p2.terminate()    time.sleep(3)    print(p1.exitcode)    print(p2.exitcode)
Log Multiprocess Operations
记录多进程操作

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享