本文主要介绍如何在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. sku二维数组里的数组从头到尾叠加组合

    今天工作之余与同事聊天,要是实现一个sku描述里的字段组合的问题.并且实现了请吃饭.哈哈.一顿饭,我和另一位同事积极杠杆的.后来实现了出来. let skuList = [ ['黑色', '白色',' ...

  2. 异常:java.lang.RuntimeException: Canvas: trying to draw too large(161740800bytes) bitmap

    现象 今天做一个安卓项目的时候,我使用了10张图片,这10张图片都是放在了drawable目录下. 根据这个错误,我在网上寻找解决问题的方案,然后我放在了mipmap-xxhdpi下结果可以运行. 但 ...

  3. fastjson 1.2.24-基于JdbcRowSetImpl的PoC构造与分析

    前言: 基于fastjson的第一种payload是基于templatesImpl的方式,但是这种方式要求Feature.SupportNonPublicField才能打开非公有属性的反序列化处理,是 ...

  4. auto_modify_ip Shell脚本安装

    #!/bin/bash # : #This author is DKS #auto modify ip of linux ############################### IP_NAME ...

  5. 带着canvas去流浪系列之二 绘制折线图

    [摘要] 用canvasAPI实现echarts简易图表 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...

  6. 17-Python执行JS代码--PyExecJS、PyV8、Js2Py

    一.Python执行JS代码--PyExecJS.PyV8.Js2Py 1.1.PyExecJS PyExecJS的优点是您不需要照顾JavaScript环境.特别是,它可以在Windows环境中运行 ...

  7. 升级xcode10.0, 终端运行 运行报错:Print: Entry, “:CFBundleIdentifier”, Does Not Exist

    目录 问题原因 解决方法 终端解决 Print: Entry, ":CFBundleIdentifier", Does Not Exist 第一步: 去官网GitHub下载对应包就 ...

  8. go proxy athens 部署到k8s

    目录 go proxy athens 部署到k8s 一.athens简介 二.部署 1.创建 PersistentVolume 2.创建service 3.创建deployment 4.ci/cd中使 ...

  9. goal

    线段树进阶,主席树,莫队,相似kmp,悬线,单调栈,单调队列,ac自动机,后缀数组,后缀自动机 图论:最短路,差分约束,二分图,网络流,连通分量 不学图论了我太难了   三分找,单调增+max+单调减 ...

  10. zabbix系列-Grafana4.6.3+Zabbix 的安装部署

    zabbix系列(五) Grafana4.6.3+Zabbix 的安装部署 伟创享 2019-07-31 11:27:18 使用了一段时间Grafana,感觉还挺好用的.部分效果图如下: ​ zabb ...