subprocess是什么?
是 Python 标准库中的一个模块,用于在 Python 脚本中创建和管理外部进程。它提供了一个强大的接口,可以与系统 shell 交互,运行外部命令,捕获它们的输出,传递参数等。 模块可以帮助你执行各种系统命令、运行其他程序,以及与外部进程进行通信。
multiprocessing是什么?
是Python标准库中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。
运用差异
- : 适用于和外部进行交互,调用外部独立的.py文件(例如调用多个.py文件同时运行的情况,进程相互独立)
- :和threading有点类似,调用该文件内部的某个函数作为子进程运行,可以提高效率,比如开启多个子进程同时跑(例如一个.py文件同时分作多个子进程,并列运行)。
- subprocess适用于与外部进程交互,调用外部进程;
- multiprocessing的核心机制是fork,重开一个进程,首先会把父进程的代码copy重载一遍,但是在windows平台上是不支持fork的,要运行在if __name__==”__main__”,就可以使用;
- fork()函数用于从一个已经存在的进程内创建一个新的进程,新的进程称为“子进程”,相应地称创建子进程的进程为“父进程”。使用fork()函数得到的子进程是父进程的复制品,子进程完全复制了父进程的资源(增加了资源开销),包括进程上下文、代码区、数据区、堆区、栈区、内存信息、打开文件的文件描述符、信号处理函数、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等信息,而子进程与父进程的区别有进程号、资源使用情况和计时器等。
适用于同时运行多个不同的任务,节省时间,提升效率;例如同时读取多台Server的内存占用率、CPU占用率;
import subprocess
import os
process = subprocess.Popen(['python3','cpu.py'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output,unused_err = process.communicate(timeout=30)
output = output.decode("utf-8","ignore")
print(output)
适用于一个任务分化为不同子进程,同时完成一个任务,节省时间,提升效率;例如全网段Ping测试,检测设备在线率。