这里我们解决以下几个问题:
多进程与多线程概念
多进程和单进程区别
python下通过multiprocessing调用多进程的基本方法
多进程与多线程概念
所谓进程,你可以简单的理解为一个可执行程序,一个没有调用多进程的可执行程序就是单个进程,如果这个可执行程序通过代码又启动了其他进程,那它就是多进程。你也可以打开windows下的任务管理器页面,如下图所示,一个图标就代表了一个进程。
如果你是linux平台的,也可以通过ps -e查看所有正在运行的进程(不同平台可能不一样,ubuntu和debian是ps -e,其他版本的如果这个命令不可用请自行百度)
这是比较直观的理解。而对于系统而言,也是专业的解释:进程是系统分配和调度资源的基本单位。所有的程序运行都需要内存空间,根据实际情况,它可能还会需要其他资源如打印机、显示窗口等。所有这些计算机系统资源和外设资源都统称为这里的资源。而进程就是系统分配和调度这些资源的基本单位。那么比进程更小的单位就是线程了。一个进程下可以有多个进程。那么,这时候,这多个线程一般会共享所属进程被分配到的资源。因此说,进程是系统分配和调度这些资源的基本单位。
而线程就是一个进程的实际执行过程,你可以简单的理解为就是进程的指令部分(不包含数据部分)。专业解释是线程是系统独立调度和分派的基本单位,这里要注意:这和上面所说的进程的专业解释是有区别的,具体区别下面介绍。
如果,这个进程同时启用两个程序,这两个程序的执行过程是允许同时进行的,那么这就是多线程了。专业的解释是
那么,什么是多进程呢?顾名思义就是多个进程同时运行。实际操作中,我们一般可以通过某个语言提供的系统调用方法启用新的进程,也可以通过该语言本身特有的方法启用新进程。在下面,我们就将通过multiprocessing启用新进程。
多进程和单进程区别
我们如果买电脑或手机或其他移动设备,那么你会经常听见有人说八核或十核高性能处理器。这里的核指的就是处理器核心。我们如果你拆开你的家用电脑或手机,你或许会发现你的电脑只有一个CPU芯片(一般只有服务器或高性能工作站的主板上有两个CPU),那么商家所谓的多核是哪里来的呢?实际上,这些核心都装在了那个看上去不大的CPU芯片里面了。CPU芯片本身只是一个载体,里面的CPU核心才是真正的“处理器”(但是CPU里面不仅有处理器,还有寄存器或者核心显卡之类的,还有其他用于管理计算机系统的部分,这里不多介绍)。而一个程序,如果他是单进程的,那么他从运行到结束,始终只会占用一块CPU。因此,理想状态下,这个程序在两个相同主频不同核心数的计算机中的运行时间是差不多的。一个程序,如果是单进程的,那么他将无法完成复杂的计算和解决突发性的事件。但是多进程就不一样了,如果这个程序采用了多进程,那么他就被允许分配多个CPU核心参与工作,能将CPU利用率提高,也能提高程序运行效率,还能很方便的坚决一些突发性事件。可以说好处多多。
但是注意:单进程哪怕你给他分配多个线程它也是始终占用一个CPU的,只不过是这多个线程轮流占用罢了。
多进程与多线程区别
先来一张图,或许会比较好理解
python下通过multiprocessing调用多进程的基本方法
# encoding=utf-8
import multiprocessing
import os
def proc_func(msg):
if __name__ == "__main__":
print "this is processing - ",msg
print os.getpid() # 获取进程id
while 1: # 死循环,阻止进程退出
pass
if __name__ == "__main__":
proc=multiprocessing.Process( # 准备一个子进程,该进程执行proc_func函数,并且为这个函数传递一个字符串参数"proc 1"
target = proc_func ,
args = ("proc 1",)
)
proc.start() # 启动进程
proc.join() # 等待子进程运行结束后再继续执行下一语句
print "Sub-process done."
需要注意
这段代码没有任何有实际意义的功能,它的目的只是为了让你能对multiprocessing调用多进程有个理解。你可以尝试分别注释proc_func中的死循环和proc.join()看看程序运行结果的区别。
哪怕在同一台计算机中不同时刻运行的同一进程,也有可能获得不同的PID
所有的进程在运行后都会获得一个唯一的进程id号,在linux系统中,使用ps -e输出所有正在运行的进程时,就有一列用于显示对应进程的PID(可以注意上方截图中的第一列头部)。windows中,任务管理器下,选中顶部的详细信息选项卡,下方就会列出所有正在运行的进程和对应PID,如下图第二列