线程
初识线程:
- 轻量级进程,直接被cpu调度
- 不能独立存在的轻量级进程
- 同一个进程中的多个线程之间的数据共享
线程和进程的关系:
线程和进程的区别可以归纳为以下4点:
- 地址空间和其他资源(如打开文件):进程间相互独立,同一个进程的各线程间共享.某进程内的线程在其他进程不可见
- 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信--需要进程同步和互斥手段的辅助,以保证数据的一致性
- 调度和切换:线程上下文切换比进程上下文切换要快的多
- 在多线程操作系统中,进程不是一个可执行的实体
全局解释器锁GIL:
- 全局解释器锁,是用来锁线程的,Cpython解释器提供的,导致了同一时刻只能有一个线程访问cpu
python线程模块的选择:
Python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。thread和threading模块允许程序员创建和管理线程。thread模块提供了基本的线程和锁的支持,threading提供了更高级别、功能更强的线程管理的功能。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。
避免使用thread模块,因为更高级别的threading模块更为先进,对线程的支持更为完善,而且使用thread模块里的属性有可能会与threading出现冲突;其次低级别的thread模块的同步原语很少(实际上只有一个),而threading模块则有很多;再者,thread模块中当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的清除工作,至少threading模块能确保重要的子线程退出后进程才退出。
thread模块不支持守护线程,当主线程退出时,所有的子线程不论它们是否还在工作,都会被强行退出。而threading模块支持守护线程,守护线程一般是一个等待客户请求的服务器,如果没有客户提出请求它就在那等着,如果设定一个线程为守护线程,就表示这个线程是不重要的,在进程退出的时候,不用等待这个线程退出
threading模块
线程的创建:
from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t=Thread(target=sayhi,args=('egon',)) t.start() print('主线程') 创建线程的方式1