多处理是为了特定目的从单个进程创建、运行、结束多个进程和线程。Python编程语言提供了许多不同的多处理特性。
多处理功能
多处理为程序或应用程序开发人员提供了许多特性。我们将列出下面的一些。
-
Performance
是多处理最流行的特性。单个流程任务可以分为多个,每个流程可以更快地完成。最终,完成的任务将在更短的时间内完成。 -
Reliability
提供的是创建简单的tas块,甚至有些块损坏了,我们可以创建一个小的任务块,其他块不干涉。 -
Efficiency
是通过使用所有CPU源来完成的,比如线程或多个CPU。现代的CPU提供了多个处理单元和线程来同时运行多个进程。通过多重处理,我们可以有效地利用这些资源。
导入多处理模块/库
Python通过 multiprocessing
模块。因此,为了使用多处理功能和能力,我们必须导入 multiprocessing
模块如下。
import multiprocessing

我们也可以看到 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()

我们可以看到,我们已经创建了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()

创建守护进程
当正常创建或派生的进程完成其执行时,其结束。这是所有正常进程的正常行为。但在某些特殊情况下,我们需要运行一个进程,比如守护进程或服务,即使没有任务要完成,它们也不会停止。守护进程主要是等待一个特定的事件比如连接,触发一些事件来运行。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)

退出状态是有意义的。
- 如果等于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)
