一、线程
(一)简介
(二)线程和进程的区别
区别
进程
线程
根本区别
作为资源分配的单位
调度和执行的单位
开销
每个进程都有独立的代码空间和数据空间(进程上下文),进程间的切换会有较大的开销
线程可以看作轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小
所处环境
在操作系统中能同时运行多个任务(程序)
在同一应用程序中有多个顺序流同时执行
分配内存
系统在运行的时候会为每个进程分配不同的内存区域
除了CPU之外,不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源
包含关系
没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的
线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程
(三)多线程
查看当前线程数量
如果想传参就重写初始化方法__init__()
(四)线程的几种状态
(五)线程共享全局变量
线程共享,进程是独立的
当为不可变对象时:
当为可变对象时:
结果是混乱的,出现了线程不安全问题,需要加入同步机制
(六)线程同步机制
下图所示是正确的加锁方法:
有时候也会出现死锁的情况:
程序锁死状态(加了锁,堵塞的,没有解锁),如下图所示:
程序锁死状态(分别占有一部分资源并同时等待对方的资源),如下图所示:
多个线程有序执行
使用Lock()创建出的锁默认没有“锁上”,.aquire()才会锁上。对于类似if lock.acquire()的判断,没有锁上为True,锁上为False,锁上再解锁为True。结果为Task1、Task2、Task3循环执行。
(七)线程同步-队列
(八)ThreadLocal