15.3 Python 线程的创建
在Python 的thread module 所提供的接口中,一定不能少的肯定是创建线程的接口,倘若没有这个接口,生活还有什么意义呢.?在上面的thread1.py 中,我们正是通过其提供的start_new_thread 创建了一个崭新的线程。好,我们就进入这个start_new_thread,看看Python 是如何进行创世纪的工作的(见代码清单15-1)。
代码清单15-1
[threadmodule.c] |
在thread_PyThread_start_new_thread 中,Python 虚拟机通过三个主要的动作,完成一个线程的创建。
代码清单15-1 的[1]、[2]和[3]分别有如下含义:
[1] 创建并初始化bootstate 结构boot,在boot 中,将保存关于线程的一切信息,
如:线程过程,线程过程的参数等。
[2] 初始化Python 的多线程环境。
[3] 以boot 为参数,创建操作系统的原生线程。
在代码清单15-1 的[1]中,我们注意到boot->interp 中保存了Python 的PyInterpreterState对象,这个对象中携带了Python 的module pool 这样的全局信息,Python 中所有的thread 都会共享这些全局信息。
关于代码清单15-1 的[2]处所示的多线程环境的初始化动作,有一点需要特别说明,当Python 启动时,是并不支持多线程的。换句话说,Python 中支持多线程的数据结构以及GIL 都是没有创建的,Python 之所以有这种行为是因为大多数的Python 程序都不需要多线程的支持。假如一个简单地统计词频的Python 脚本中居然出现了多线程,面对这样的代码,我们一定都会抓狂的。
对多线程的支持并非是没有代价的,最简单的一点,如果激活多线程机制,而执行的Python 程序中并没有多线程,那么在100 条指令之后,Python 虚拟机同样会激活线程的调度。而如果不激活多线程,Python 虚拟机则不用做这些无用功。所以Python 选择了让用户激活多线程机制的策略。在Python 虚拟机启动时,多线程机制并没有被激活,它只支持单线程,一旦用户调用thread.start_new_thread,明确指示Python 虚拟机创建新的线程,Python 就能意识到用户需要多线程的支持,这个时候,Python 虚拟机会自动建立多线程机制需要的数据结构、环境以及那个至关重要的GIL。
| 回书目 上一节 下一节 |