一.进程与线程
1.进程:计算机程序是存储在磁盘里面的可执行二进制文件,只有把它加载到内存里面才能被操作系统执行,才拥有生命周期。进程(有时称为重量级进程)是一个执行中的程序。每个进程拥有自己的地址空间,内存,数据栈以及其他用于跟踪执行的辅助数据。操作系统管理其上所以的线程的执行,并为这些线程合理地分配时间。(摘自《Python核心编程(第三版)》)
2.线程:与进程类似,不过它们是在同一个进程下执行的,并共享相同的上下文。线程包括开始,执行顺序和结束三个部分。它有一个指令指针,用于记录当前运行的上下文。当其他线程运行时,它可以被抢占(中断)和临时挂起(睡眠),这又叫让步(yielding)。(摘自《Python核心编程(第三版)》)
3.线程与进程的关系:引用知乎上的一句话——进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。线程是建立在进程的基础上的一次程序运行单位,一个进程中的各个线程与主线程共享一片数据空间,因此相对与独立的进程来说,线程间的数据共享与通信更加容易。线程一般是以并发的方式执行的,正是由于这种并行和数据共享机制,让多任务间协作成为可能。当然这种共享是有风险的,如果两个线程或多个线程访问同一片数据,由于访问顺序不同,可能导致结果不同,这种情况通常成为竟态条件(race condition)。还有一个问题需要注意,线程无法给予公平的执行时间。这是因为一些函数会在完成前保存阻塞状态,如果没有专门为多线程情况进行修改,会导致cpu的时间分配向这些贪婪的函数倾斜。
二.Python中的多线程
1.Pythond特殊的并发特性:python的代码的执行是由Python虚拟机(又称解释器主循环)进行控制的。Python在设计时是这么考虑的,在主循环中同时只能有一个控制线程在执行,就像单核CPU系统中的多线程一样。内存可以有许多程序,但在任意时刻只能有一个进程在运行。
2.全局解释器锁(GIL):对python虚拟机的访问是由全局解释器锁控制的。这个锁就是来保证同时只能有一个线程运行的。在多线程环境下,python虚拟机按以下方式执行:
1).设置GIL。
2).切换进一个进程去运行。
3).执行下面两个操作之一:a.指定数量的字节码指令;b.线程主动让出控制权(可以调用time.sleep()来完成)。
4).把线程设置会睡眠状态(切换出线程)。
5).解释GIL。
6).重复上述过程。
PS:调用外部代码时(即任意c/c++扩展的内置函数),GIL会保持锁定,直到函数调用完毕。(摘自《Python核心编程(第三版)》)
三,线程间的通信用语(个人理解)
1.同步:由于线程间可能访问同一片内存区域或文件或数据等,如果同时进行读或写就会发生冲突,因此需要按照一定顺序来安排线程的运行。“线程同步”,通俗点讲,就是让线程排队,一个执行完再运行下一个。
2.异步:多个线程同时一起运行,互不干扰。
3.阻塞:一个主线程在运行时,需要停下来等待子线程返回,则说这个子线程是阻塞的。
4.非阻塞:主线程能够持续地运行而不用等待子线程返回,而是互相独立地运行,则称子线程是非阻塞的。
5.守护进程:对于一般线程,进程会等待一般线程结束后才结束,而对于守护线程,主线程运行完后会直接结束,不管子线程是否还在工作,进程退出后,子线程也自然会退出。
网友评论