本节主要记录如何在 Python 中使用线程,其中包括全局解释器锁对线程的限制和对应的学习脚本。python
Python 代码的执行是由 Python 虚拟机(又叫解释器主循环)进行控制的。编程
对 Python 虚拟机的访问是由全局解释器锁(GIL)控制的。步骤为:数据结构
设置 GIL;多线程
切换进一个线程去运行;函数
执行下面操做之一:oop
a. 指定数量的字节代码指令;学习
b. 线程主动让出控制权(能够调用 time.sleep(0) 来完成)。spa
把线程设置回睡眠状态(切换出线程);操作系统
解锁 GIL;线程
重复上述步骤
当一个线程完成函数的执行时,它就会退出。
退出的方法还有:
经过调用如 thread.exit() 之类的退出函数;
如 sys.exit() 之类的退出 Python 进程的标准方法;
抛出 SystemExit 异常,来使线程退出。
不能直接“终止”一个线程;
Python 虽然支持多线程编程,可是还须要取决于它所运行的操做系统。
支持多线程的操做系统:绝大多数类 UNIX 平台(如 Linux、Solaris、Mac OS X、*BSD等)以及 Windows 平台;
要肯定解释器(或者说你的系统)是否支持线程,能够从交互式解释器中尝试导入 thread 模块,若是可用则不会产生错误。以下:
>>> import thread
若是 Python 解释器没有将线程支持编译进去,模块导入将会失败
>>> import thread
Traceback (most recent call last): File "<stdin>", line 1, in <module>ModuleNotFoundError: No module named 'thread'
**注:在 Python 3 中 thread 模块被重命名为 _thread (缘由为日常使用不推荐用 thread 模块,只建议那些想访问线程的更底层级别的专家使用)。
经过一个简单的例子代码来演示在不使用线程的状况下是如何工做的,方便后面对比使用线程的状况。如下为代码:
1 #!/usr/bin/env python 2 3 from time import sleep, ctime 4 5 def loop0(): 6 print('start loop 0 at:', ctime()) 7 sleep(4) 8 print('loop 0 done at:', ctime()) 9 10 def loop1(): 11 print('start loop 1 at:', ctime()) 12 sleep(3) 13 print('loop 1 done at:', ctime()) 14 15 def main(): 16 print('starting at:', ctime()) 17 loop0() 18 loop1() 19 print('all DONE at:', ctime()) 20 21 if __name__ == '__main__': 22 main()
运行后的输出结果:
1 starting at: Sun Jul 22 17:15:13 2018 2 start loop 0 at: Sun Jul 22 17:15:13 2018 3 loop 0 done at: Sun Jul 22 17:15:17 2018 4 start loop 1 at: Sun Jul 22 17:15:17 2018 5 loop 1 done at: Sun Jul 22 17:15:20 2018 6 all DONE at: Sun Jul 22 17:15:20 2018
Python 提供了多个模块来支持多线程编程,包括 thread 、threading 和 Queue 模块等。
thread 模块提供了基本的线程和锁定支持;
threading 模块提供了更高级别、功能更全面的线程管理;
Queue 模块能够建立一个队列数据结构,用于在多线程之间进行共享;
在实际进行多线程编程过程当中应该避免使用 thread 模块:
threading 模块更加先进、有更好的进程支持,thread 模块中的一些熟悉会和 threading 模块冲突;
thread 模块拥有的同步原语注释只有一个(同步原语用于控制执行和访问);