本文主要介绍如何在python中使用线程。

全局解释器锁:

python代码的执行是由python虚拟机(又名解释器主循环)进行控制的。python中,主循环中同时只能有一个控制线程在执行,就像单核CPU系统中的多线程一样——内存中可以有很多程序,但是在任意给定时刻只有有一个程序在执行。同理,虽然python解释器中可以运行多个线程,但是在任意给定的时刻,只能有一个线程被解释器执行。

上述对python解释器的访问是由全局解释器锁(GIL)控制的。这个锁的核心作用就是用来保证同时只有能一个线程运行。

多线程环境中,python虚拟机将按照一下方式顺序执行:

  1. 设置GIL
  2. 切换进一个线程去
  3. 执行下面操作之一:  
    1. 指定数量的字节码指令
    2. 线程主动让出控制权(可以调用time.sleep(0)来完成)
  4. 把线程设置回睡眠模式(切换出线程)
  5. 解锁GIL
  6. 重复上述步骤

当调用外部代码(即,任意C/C++扩展的内置函数)时,GIL会保持锁定,直到函数执行结束,这是因为在此期间没有python字节码计数。

例如,对于任意面向IO的python例程(指调用了内置的操作系统C代码的那种),GIL会在IO调用前被释放,以允许其他线程在IO执行的时候运行。而对于那些没有太多的IO操作的代码来说,更倾向于在该线程整个整个时间片内始终占有处理器和GIL。换句话说,IO密集型的python程序要比计算密集型的代码更好的利用多线程机制。

退出线程

当一个线程完成函数的执行时,就会退出。另外,我们也可以通过调用类似thread.exit()的方法,或者是类似sys.exit()的方法直接退出进程,还可以通过抛出SystemExit的异常来迫使线程退出。你并不能直接‘终止’一个线程。

python 中关于线程提供了多个相关的模块,thread(后改为_thread)、threading和Queue等。_thread提供了基本的线程和锁定支持,threading提供了更高级别、功能更全面的线程管理,可以说后者是对对前者进行了封装后的高级体现,一般建议使用后者。使用Queue模块,可以创建一个队列数据,用于在多线程之间进行共享。

可以通过尝试导入threading模块的方式,确认解释器是否支持线程(如果导入成功,则说明解释器支持线程)。

首先通过一个不使用线程例子来演示线程是如何工作的。这里要借用time.sleep()函数,以指定的秒数进行‘睡眠’(即程序会暂时停止指定的时间):

#!/usr/bin/env/ python
from time import sleep,ctime
def loop0():
print('开始循环0次在:',ctime())
sleep(4)
print('结束循环0次在:',ctime()) def loop1():
print('开始循环1次在:',ctime())
sleep(2)
print('结束循环1次在:',ctime()) def main():
print('开始于:',ctime())
loop0()
loop1()
print('所有的任务都完成于:',ctime()) if __name__ == '__main__':
main()

下面是执行结果:

PS C:\Users\WC> python E:\Python3.6.3\workspace\onethr.py
开始于: Mon Mar 26 21:13:29 2018
开始循环0次在: Mon Mar 26 21:13:29 2018
结束循环0次在: Mon Mar 26 21:13:33 2018
开始循环1次在: Mon Mar 26 21:13:33 2018
结束循环1次在: Mon Mar 26 21:13:35 2018
所有的任务都完成于: Mon Mar 26 21:13:35 2018

该脚本在一个单线程中连续执行两个循环,一个循环必须是在另一个开始前结束,总共的消耗时间是每个循环所用时间之和。

接下来的章节我们分别具体介绍thread、threading和Queue模块。

python 多线程编程之使用进程和全局解释器锁GIL的更多相关文章

  1. python 线程队列、线程池、全局解释器锁GIL

    一.线程队列 队列特性:取一个值少一个,只能取一次,没有值的时候会阻塞,队列满了,也会阻塞 queue队列 :使用import queue,用法与进程Queue一样 queue is especial ...

  2. 并发编程——全局解释器锁GIL

    1.全局解释器锁GIL GIL其实就是一把互斥锁(牺牲了效率但是保证了数据的安全). 线程是执行单位,但是不能直接运行,需要先拿到python解释器解释之后才能被cpu执行 同一时刻同一个进程内多个线 ...

  3. python 什么是全局解释器锁GIL

    什么是全局解释器锁GIL Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在 ...

  4. 21.线程,全局解释器锁(GIL)

    import time from threading import Thread from multiprocessing import Process #计数的方式消耗系统资源 def two_hu ...

  5. 全局解释器锁GIL

    我们使用高并发,一次是创建1万个线程去修改一个数并打印结果看现象: from threading import Thread import os def func(args): global n n ...

  6. 全局解释器锁GIL & 线程锁

    1.GIL锁(Global Interpreter Lock) Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行 ...

  7. Python核心技术与实战——十九|一起看看Python全局解释器锁GIL

    我们在前面的几节课里讲了Python的并发编程的特性,也了解了多线程编程.事实上,Python的多线程有一个非常重要的话题——GIL(Global Interpreter Lock).我们今天就来讲一 ...

  8. Python全局解释器锁 -- GIL

    首先强调背景: 1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能 ...

  9. Python如何规避全局解释器锁(GIL)带来的限制

    编程语言分类概念介绍(编译型语言.解释型语言.静态类型语言.动态类型语言概念与区别) https://www.cnblogs.com/zhoug2020/p/5972262.html Python解释 ...

随机推荐

  1. python3 之 函数传参

    一.可变对象与不可变对象 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象. 不可变类型:变量赋值 a=5 后 ...

  2. Matlab生成Word--xdd

    摘自<MATLAB统计分析与应用:40个案例分析>(谢中华老师著)P452页function CreatWord %利用Matlab生成word filespec_user = [pwd ...

  3. tcp协议传输方法&粘包问题

    socket实现客户端和服务端 tcp协议可以用socket模块实现服务端可客户端的交互 # 服务端 import socket #生成一个socket对象 soc = socket.socket(s ...

  4. 特殊权限set_uid、set_gid、stick_bit、软链接、硬链接文件 使用介绍

    第2周第4次课(3月29日) 课程内容:2.18 特殊权限set_uid2.19 特殊权限set_gid2.20 特殊权限stick_bit2.21 软链接文件2.22 硬链接文件     2.18  ...

  5. SSO单点登录思路

    SSO (Single Sign On) 什么是单点登录: 在大型的互联网公司中会有多个系统, 多个项目, 虽然这些项目都属于同一家公司, 但是项目本身其实都是独立的, 那多个系统可不可以实现共享同一 ...

  6. OC中ARC forbids explicit message send of release错误

    在ios编程中,如果成员变量为对象,我们需要对成员变量内存管理,否则,会造成内存泄露.即我们要对成员变量进行手动的内存释放. 很显然,是ARC的问题. 错误原因:在创建工程的时候点选了“Use Aut ...

  7. 2019-2020-1 20199304《Linux内核原理与分析》第七周作业

    进程的描述和进程的创建 1.进程描述 1.1操作系统的三大管理功能以及对应的抽象概念: 进程管理 内存管理 文件系统 1.2Linux进程的状态: (1)Linux中进程的状态细分可以分为七种: R运 ...

  8. 转载一篇关于tab键与focus的文章

    Focusable HTML 元素中,并不是所有元素都可以获得焦点,有如下元素可以获得焦点: a, area, button, input, object, select, textarea,这些元素 ...

  9. oc工程中oc、swift混编代码打包成静态framework踩坑笔记

    参考资料: https://www.jianshu.com/p/734341f7c242 https://www.jianshu.com/p/55038871e7de   两天时间探索,期间不知道遇到 ...

  10. mysql-常用组件之触发器

    基本概念 触发器是一种特殊的存储过程,不像存储过程需要显示调用,触发器通过监控表事件(增删改操作)自动触发某条 sql 的执行,可以用于购物车加购后库存减少等场景. 触发器基本操作 1. 创建触发器 ...