如何创建Python多线程环境

开发 后端
Python多线程环境是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

Python里,进程和线程都是操作系统的概念,在这种线程模型中,一个进程中只能有一个线程,剩下的进程必须等待当前的线程执行完,下文进行详细说明介绍解析。

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

  1. [threadmodule.c]  
  2.  
  3. static PyObject* thread_PyThread_start_new_thread(PyObject *self, PyObject  
  4.  
  5.   *fargs)  
  6.  
  7. {  
  8.  
  9.     PyObject *func, *args, *keyw = NULL;  
  10.  
  11.     struct bootstate *boot;  
  12.  
  13.     long ident;  
  14.  
  15.     PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3, &func, &args,  
  16.  
  17.       &keyw);  
  18.  
  19.     //[1]:创建bootstate结构  
  20.  
  21.     boot = PyMem_NEW(struct bootstate, 1);  
  22.  
  23.     boot->interp = PyThreadState_GET()->interp;  
  24.  
  25.     boot->funcfunc = func;  
  26.  
  27.     boot->argsargs = args;  
  28.  
  29.     boot->keywkeyw = keyw;  
  30.  
  31.     //[2]:初始化多线程环境  
  32.  
  33.     PyEval_InitThreads(); /* Start the interpreter's thread-awareness */  
  34.  
  35.     //[3]:创建线程  
  36.  
  37.     ident = PyThread_start_new_thread(t_bootstrap, (void*) boot);  
  38.  
  39.     return PyInt_FromLong(ident);  
  40.  

代码清单15-1的[1]、[2]和[3]分别有如下含义:

[1]  创建并初始化bootstate结构boot,在boot中,将保存关于线程的一切信息,如:线程过程,线程过程的参数等。

[2]  初始化Python多线程环境

[3]  以boot为参数,创建操作系统的原生线程。

在代码清单15-1的[1]中,我们注意到boot->interp中保存了Python的PyInter- preterState对象,这个对象中携带了Python的module pool这样的全局信息,Python中所有的thread都会共享这些全局信息。关于代码清单15-1的[2]处所示的多线程环境的初始化动作,有一点需要特别说明,当Python启动时,是并不支持多线程的。

换句话说,Python中支持多线程的数据结构以及GIL都是没有创建的,Python之所以有这种行为是因为大多数的Python程序都不需要多线程的支持。假如一个简单地统计词频的Python脚本中居然出现了多线程,面对这样的代码,我们一定都会抓狂的J。#t#

对多线程的支持并非是没有代价的,最简单的一点,如果激活多线程机制,而执行的Python程序中并没有多线程,那么在100条指令之后,Python虚拟机同样会激活线程的调度。而如果不激活多线程,Python多线程环境虚拟机则不用做这些无用功。所以Python选择了让用户激活多线程机制的策略。在Python虚拟机启动时。

多线程机制并没有被激活,它只支持单线程,一旦用户调用thread.start_new_thread,明确指示Python虚拟机创建新的线程。Python就能意识到用户需要多线程的支持,这个时候,Python多线程环境会自动建立多线程机制需要的数据结构、环境以及那个至关重要的GIL。

责任编辑:chenqingxiang 来源: 博客园
相关推荐

2010-03-15 17:56:23

Java多线程

2010-03-10 08:54:49

Python多线程

2023-06-06 08:17:52

多线程编程Thread类

2009-06-29 18:00:05

Java多线程Runnable接口创建线程

2010-03-12 16:39:55

Python多线程

2009-06-29 17:54:10

Java多线程Thread类创建线程

2021-02-25 15:58:46

C++线程编程开发技术

2017-03-08 14:18:37

Linux多线程编程

2023-10-06 23:06:01

多线程Python

2010-02-01 17:25:09

Python多线程

2009-08-12 13:22:44

Singleton模式

2023-10-19 08:30:58

线程源码thread

2011-10-31 15:59:56

SQLiteiPhoneiOS

2021-08-12 14:33:20

Python多线程编程

2010-03-15 11:07:13

Python多线程

2009-03-12 10:52:43

Java线程多线程

2010-03-18 16:02:09

python 多线程

2023-05-12 14:14:00

Java线程中断

2020-11-18 09:48:09

Synchronize多线程Java

2011-07-01 11:18:50

Qt 多线程
点赞
收藏

51CTO技术栈公众号