一、进程的概念
简单来说一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是所每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。
ps:一个程序运行后至少产生一个进程,一个进程默认有一个线程,进程里可以创建多个线程,线程是依附在进程里的,没有进程就没有线程。
1、process进程类的说明
Process([group [, target [, name [, args [, kwargs]]]]])
- group:指定进程组,目前只能使用none
- target:执行的目标任务
- name:进程名字
- args:以元组方式传参
- kwargs:以字典方式传参
2、process创建的实例对象的常用方法
- start():启动子进程实例(创建子进程)
- join():等待子进程执行结束
- terminate():不管任务是否完成,立即终止子进程
3、process创建的实例对象的常用属性
- name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
4、基本使用步骤
1、导入进程包
import multiprocessing
2、创建子进程并指定执行任务
sub_process = multiprocessing.Process(target=任务名)
3、启动进程执行任务
sub_process.start()
为了保证子进程能够正常的运行,主进程会等所有的子进程执行结束后再销毁,设置守护进程的目的是主进程退出子进程销毁,不让主进程再等待主进程去执行
设置守护主进程方式:子进程对象.daemon = True
销毁子进程方式:子进程对象.terminate()
ps:进程之间不共享全局变量、主进程会等待所有子进程执行结束再结束
二、线程的概念
线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要CPU进行调度,也就是说线程是CPU调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常所说的主线程。
ps:线程共享全局变量,进程不共享全局变量
线程类Thread参数说明
- group:线程组,目前只能使用none
- target:执行的目标任务名
- args:以元组的方式传参
- kwargs:以字典的方式传参
- name:线程名,一般不用设置
启动线程
启动线程使用start()方法
互斥锁
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制。线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定\非锁定。
某个线程要更改共享数据时,先将其锁定,此时资源的状态为‘锁定’,其他线程不能更改,直到该线程释放资源,将资源的状态变成‘非锁定’,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
import threading
#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire()
#释放锁
mutex.release()
锁优缺点:
优点:确保了某段关键代码只能由一个线程从头到尾完整地执行
缺点:阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率大大降低;由于可以存在多个锁,不同的线程有不同的锁,并试图获取对方持有的锁时,可能会造成死锁。
线程与进程的区别:线程执行开销小,但不利于资源的管理和保护;而进程相反。