讲实现多线程之前,先了解什么是进程、什么是线程、以及两者的区别?
一、进程与线程
进程:是资源分配的最小单位,也可以指程序从开始到结束的一个过程。
线程:是操作系统进行运算调度的最小单位,一个进程至少有一个线程。
区别:
所有线程共享创建它的进程地址空间,而进程之间的地址空间是独立的。
所有线程共享创建它的进程数据,而进程之间的数据不能互相访问。
线程之间可以相互通讯、互相操作,而进程之间不可以。
二、全局解释器锁(GIL)
Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高。
原因如下:
Python代码的执行是由Python虚拟机进行控制。它在主循环中同时只能有一个控制线程在执行,意思就是Python解释器中可以运行多个线程,但是在执行的只有一个线程,其他的处于等待状态。
这些线程执行是有全局解释器锁(GIL)控制,它来保证同时只有一个线程在运行。在多线程运行环境中,Python虚拟机执行方式如下:
设置GIL
切换进线程
执行下面操作之一:1.运行指定数量的字节码指令;2.线程主动让出控制权
切换出线程(线程处于睡眠状态)
解锁GIL
进入1步骤(设置GIL)
三、Python 的 threading 模块
Python 常用的多线程模块有threading 和 Queue,在这里我们将 threading 模块。
threading 模块的Thread 类是主要的执行对象。使用Thread 类,可以有很多方法来创建线程。最常用的有下面三种:
创建Thread 的实例,传给它一个可调用对象(函数或者类的实例方法)。
派生Thread 的子类,并创建子类的实例。