python中多线程调度机制以及GIL

总结下python中线程调度机制.

对于线程调度机制而言,同操作系统的进程调度一样,最关键是要解决两个问题:

1.在何时选择挂起当前线程,并选择处于等待的先一个线程呢?

2.在众多等待的线程中,选择哪一个作为激活线程呢?

在python多线程机制中,这个两个问题是有两个层次解决的。

如,进程间的切换,当发生了时钟中断,操作系统响应时钟中断,并在这个时候开始进程的调度。 同样的,python也是通过软件模拟了这样的时钟中断,来激激活线程的调度。

我们知道,python字节码解释器是按照指令,顺序一条一条地执行。这就可以在python内部维护一个数值,即就是时钟。如果为N,即当执行了N条指令后,就应该立即启动线程调度机制。

import sys

sys.getcheckinterval()

同时也可以通过sys.setcheckinterval()来调节这个值。

那么接下来,python该在等待的线程中选择哪一个执行呢? 答案是:不知道。 因为python完全没有插手。 由于python是建立在操作系统的原生线程上,所以这样头大的事情就交给操作系统吧。由于不同操作系统的调度机制不一样,故,python提供了一层抽象机制,即  thread(c 实现)以及在其之上的threading(python实现)。  multiprocessing ??

python线程的创建。

通过源码分析,主要完成三个动作:

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

2.初始化python的多线程环境。(创建GIL)

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

特别说明:python启动时,是并不支持多线程的,换句话说,python的多线程的数据结构以及GIL都是没有创建的,这样做,是因为python代码,大部分都不需要多线程的支持。

因为对多线程的支持是有一定代价的:如果激活了多线程机制,而执行的python程序中没有用到多线程,那么在100条指令之后,python虚拟机同样会激活线程的调度。这样就多了一些无用功。

所以,python就把这些留给用户方便、灵活地去控制了。

GIL是什么? 看看源码的主要定义,及其初始化:

typedef struct NRMUTEX {

LONG owned;

DWORD thread_id;

HANDLE hevent;

} NRMUTEX, *PNRMUTEX;

BOOL InitializeNonRecursiveMutex(PNRMUTEX mutex)

{

mutex->owned = -1;

mutex->thread_id = 0

mutex->hevent = CreateEvent(NULL, FALSE, FALSE, NULL)

return mutex->hevent != NULL;// True if the mutex is created

python中多线程调度机制以及GIL

时间: 2024-08-23 02:15:51

python中多线程调度机制以及GIL的相关文章

python中import的机制与实现

原文出处: 刘畅(@你猜我猜不猜猜你是谁) 概述 Python 是一门优美简单.功能强大的动态语言.在刚刚接触这门语言时,我们会被其优美的格式.简洁的语法和无穷无尽的类库所震撼.在真正的将python应用到实际的项目中,你会遇到一些无法避免的问题.最让人困惑不解的问题有二类,一个 编码问题,另一个则是引用问题. 本文主要讨论关于Python中import的机制与实现.以及介绍一些有意思的Python Hooks. Python 类库引入机制 首先,看一个简单的例子: """

Python 中的驻留机制:小数据池和代码块

Python 中的驻留机制:小数据池和代码块 Python 中的驻留机制主要有两个:小数据池和代码块.驻留机制并不是学习 Python 过程中特别重要的概念,我们学习小数据池的目的主要有两个方面: 解决日后写代码过程中可能出现的疑惑.在后期开发中,能 明确 知道有些代码为什么不能正常使用 找工作面试时或多或少可能被问到,关键时刻起到装 X 的作用 先补充一个关键字 is.is(是) 和 ==(等于) 的作用十分相似,我们在这里将它们进行一个对比: == : 官方:判断等号两边的内容是否相同 白话

python中垃圾回收机制和对象变量的指向问题,深拷贝

变量.对象和引用 一个变量也就是变量名,当代码第一次赋值时就创建了他,之后的赋值将改变已创建的变量名的值. 变量类型,变量中没有类型之说,类型存在于对象中,变量只是在一个特定的时间对对象的引用. 变量使用,变量出现在表达式中会立即被对象所替代,所有变量在使用前就应该对其明确赋值. 例如 a = 3 为例 python将执行3个步骤完成这个请求 1.创建一个对象来代表3 2.创建一个一个变量a,如果他还没创建的话, 3.将变量与新的对象相连接 变量-引用-对象 对象的垃圾回收机制 当变量名被赋予了

python中的内存机制

首先要明白对象和引用的概念 (例子:a=1, a为引用,1为对象,对象1的引用计数器为1,b=1此时内存中只有一个对象1,a,b都为引用,对象的引用计数器此时为2,因为有两个引用) a=1,b=1 id(a)=id(b) #短的字符串,数字python在内存中是一个对象 a=[],b=[] id(a)!=id(b) #字典,数组这样的对象在内存中python会new两个不同的对象 a="new a string" b="new a string" #长的字符串pyt

python中多线程,多进程,队列笔记(一)

threading简介:If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks si

python中多线程

多线程 什么是多线程 开启线程的两种方式 进程和线程的区别 Thread对象的其他属性和方法 守护线程 死锁现象与递归锁 信号量.Event定时器 线程Queue 进程池和线程池 什么是多线程 在传统意义上,每个进程有一个地址空间,而且默认就会有一个控制线程. 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于CPU),而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间至少要有一条流水线. 所以,进程只是用来把

python中多线程(1)

一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小,因而创建线程的速度快 2 from multiprocessing import Process 3 from threading import Thread 4 import os 5 import time 6 def work(): 7 print('<%s> is running'%os.

《python解释器源码剖析》第16章--python的多线程机制

16.0 序 在介绍多线程之前,我们要先知道线程是什么,线程是操作系统调度cpu工作的最小单元,同理进程则是操作系统资源分配的最小单元,线程是需要依赖于进程的,并且每一个进程只少有一个线程,这个线程我们称之为主线程.而主线程则可以创建子线程,一个进程中有多个线程去工作,我们就称之为多线程.关于线程,请记住两句话,这两句话我们在前面章节中也已经提过了. python中的一个线程,对应c语言中的一个线程,然后对应操作系统的一个线程,操作系统的线程我们一般称之为原生线程,这三者是一一对应的. pyth

Python中的线程与进程

进程与线程 在多任务处理中,每一个任务都有自己的进程,一个任务会有很多子任务,这些在进程中开启线程来执行这些子任务.一般来说,可以将独立调度.分配的基本单元作为线程运行,而进程是资源拥有的基本单位. python支持多进程multiprocessing,以及多线程threading. 多进程 os.fork()函数可以开启一个进程.该函数会返回两次值,分别在父进程中返回子进程的ID,而在子进程中永远返回0. os.getpid()函数可以返回进程的ID.os.getppid()则可以返回父进程的