1.进程是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈及其他记录其运行轨迹的辅助数据。
2.运行在同一进程中的多个线程,共享相同的运行环境。线程有一个自己的指令指针,记录自己运行到什么地方。
3.虽然Python解释器可以“运行”多个线程,但在任意时刻,只有一个线程在解释器中运行。对Python虚拟机的访问由全局解释器锁(global interpreter lock,GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。
4.threading模块提供以下类:
Thread :线程类
Timer :与 Thread类似,但要等待一段时间后才开始运行
Lock :锁原语
RLock :可重入锁。使单线程可以再次获得已经获得的锁
Condition :条件变量,能让一个线程停下来,等待其他线程满足某个“条件”
Event :通用的条件变量。多个线程可以等待某个事件发生,在事件发生后,所有的线程都被激活
Semaphore :为等待锁的线程提供一个类似“等候室”的结构
BoundedSemaphore :与Semaphore类似,但不允许超过初始值
5.queue模块:实现了多生产者、多消费者的队列,支持锁原语,能够在多个线程之间提供很好的同步支持。提供的类:
Queue :队列
LifoQueue :后入先出队列
PriorityQueue :优先队列
6.Thread类是主要的线程类,可以创建进程实例。该类提供的函数包括:
start() :开始线程执行
run() :定义线程的功能函数
join(timeout=None) :程序挂起,直到线程结束。如果给出timeout,则最多阻塞timeout秒。
is_alive() :线程是否还在运行中
isDaemon() :是否是守护线程,返回其daemon属性值。
7.线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。某个线程要更改共享数据时,先将其锁定,待该线程释放资源时,其他线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
threading模块中定义了Lock类,可以方便地处理锁定:
<pre class="python" name="code">#创建锁
mutex=threading.Lock()
#锁定
mutex.acquire()
#释放
mutex.release()
8.同步阻塞:当一个线程调用锁的acquire()方法获得锁时,锁就进入"locked"状态。此时如果另一个线程试图获得这个锁,该线程会变成"blocked"状态,称为“同步阻塞”。
9.可重入锁:为了支持在同一线程中多次请求统一资源,python提供了“可重入锁”:threading.Rlock。Rlock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。
10.互斥锁是最简单的线程同步机制,threading的Condition对象提供了对复杂线程同步问题的支持。Conditon被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了 wait 和 notify 方法。
11.队列同步:queue模块提供了同步的、线程安全的队列类,这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。
12.threading.Event可以使一个线程等待其他线程的通知,其内置了一个标志,初始值为False。线程都过wait()方法进入等待状态,直到另一个线程调用set()方法将内置标志设置为True时,Event通知所有等待状态的线程恢复运行。
13.Thread类的join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行。