概述:
什么是进程?什么是线程?
进程: 在任务管理器中一个任务就是一个进程 (一般情况下一个程序,就是一个进程)
线程: 启动一个进程之后,还有许多子任务需要同时处理,这些子任务就是线程 (一个进程可以有许多个线程,进程一旦结束,线程也会同时结束)
关系: 线程是进程的最小单位,一个进程最少会有一个线程
PID: 每一个进程都会被系统分配到一个PID用于识别 (Process Identifier:进程标识符)
多进程与多线程的用途
之前写的程序都是单进程单线程程序, 但有时候不等于,需要同时处理某个信息,就需要使用多进程或多线程
但多进程与多进程使用起来非常麻烦 必须协调好通信,必须控制什么时候暂停任务,什么时候开始任务 哪个任务完成后,才能执行另一个任务
Python进程特点
os.getpid( )
os.getppid( )
os.getpid( )可以返回当前进程的PID os.getppid( )在子进程中,可以返回父进程的PID
我们试着写一个程序,并让它陷入死循环, 并进入任务管理器查看他的状态
import os
print(os.getpid())
print(os.getppid())
i =0
while i<=3:
pass
print("done")
文件被打开时,启动了(PID:22948)py程序, py程序有建立了一个(PID:24852)python的子进程。
我们会发现打开了两个进程,而我们的代码并没有建立子进程,原因python是脚本(解释性语言) python在(PID:22948)py**脚本被执行时,会生成子进程(PID:24852)**python解释器
单进程Python程序会有两个进程的原因:
最传统的C语言,如果想要执行源码,需要先将源码翻译成机器语言(可执行程序)才能运行 而脚本语言只要计算机装有解释器,就可以直接执行脚本源码,而不需要复杂的过程。
可执行程序: 是通过机器语言(可执行程序)直接控制CPU完成相应的工作 脚本程序: 是通过脚本语言(脚本程序)控制解释器(可执行程序)完成相相应的工作 (解释器也是一种特殊的可执行程序) (脚本通过解释器间接的对cpu进行操作)
> 因此.py程序在运行时,必须生成一个解释器进程时时翻译
而python不会生成机器语言,只会控制解释器如何去运行
虽然python方便,但是无任何python不能用于编写系统等底层的东西,python必须建立在已有系统的基础上
进程与线程的优缺点
进程 优点: 当一个子进程崩溃时,不会影响到其他子进程运行(如果是主线程崩溃,子线程必定崩溃) 缺点: 会占用较高的系统资源,尤其是windows,Linux系统会好很多(通常多进程任务会用Linux来做) 特点: 进程的变量是相互独立的,他们之间没有直接关联
线程 优点: Windows对子线程优化会比较好,线程的运行速度也会稍微快一点点 缺点: 1、当一个进程的子线程崩溃时,可能导致整个进程崩溃 2、Python的同一进程内多线程只会用到1个CPU,即使你有100核的CPU, 同时跑100个线程也只会在1个CPU里交替运行 (Python多进程可以利用到多核,但线程是没办法的) (C/C++不会有这个问题) 特点: 线程的变量是公用的,如果修改了一个全局变量,主线程和子线程都会受到影响
由于这两种形式的特点,有时候会考虑 多进程+多线程 的模式 当然能不用多进程和多线程是最好的选择
如何设计主、子进程(线程)之间的关系
一般情况下,都会用Master-Worker的工作模式 主进程(线程)负责分配任务 子进程(线程)负责执行任务