您所在的位置: 首页>>读书频道>>设计开发>>其它开发>>

15.3 Python 线程的创建

http://book.51cto.com  2008-07-23 16:46  陈儒著  电子工业出版社  我要评论(0)
  • 摘要:《Python源码剖析--深度探索动态语言核心技术》第15章主要讲述的是Python 多线程机制,本小节为大家介绍的是 Python 线程的创建。
  • 标签:Python  源码剖析  GIL动态语言  C程序员

15.3 Python 线程的创建

在Python 的thread module 所提供的接口中,一定不能少的肯定是创建线程的接口,倘若没有这个接口,生活还有什么意义呢.?在上面的thread1.py 中,我们正是通过其提供的start_new_thread 创建了一个崭新的线程。好,我们就进入这个start_new_thread,看看Python 是如何进行创世纪的工作的(见代码清单15-1)。

代码清单15-1

 [threadmodule.c]
static PyObject* thread_PyThread_
start_new_thread(PyObject *self, PyObject
*fargs)
{
PyObject *func, *args, *keyw = NULL;
struct bootstate *boot;
long ident;
PyArg_UnpackTuple(fargs, "start_new_
thread", 2, 3, &func, &args,
&keyw);
//[1]:创建bootstate 结构
boot = PyMem_NEW(struct bootstate, 1);
boot->interp = PyThreadState_GET()->interp;
boot->func = func;
boot->args = args;
boot->keyw = keyw;
//[2]:初始化多线程环境
PyEval_InitThreads(); /* Start the
interpreter's thread-awareness */
//[3]:创建线程
ident = PyThread_start_new_thread
(t_bootstrap, (void*) boot);
return PyInt_FromLong(ident);
}

在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。

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
Python实用开发指南
深入Vista应用程序开发
Ruby on Rails 社区网站开发
ASP.NET从入门到精通
Java完全自学宝典
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有