1.认识GIL:

说到GIL一直是代码专家们一直以来想要解决的问题,也是被许多程序员诟病的,下面带领大家看下官方threading模块document中如何去描述对于GIL这个全局解释器锁的:https://docs.python.org/3/library/threading.html

全局解释器锁

所使用的机制的CPython解释器来确保只有一个线程执行的Python 字节码在一个时间。通过使对象模型(包括关键的内置类型,例如dict)隐式安全地防止并发访问,从而简化了CPython的实现。锁定整个解释器可以使解释器更容易进行多线程处理,但会牺牲多处理器机器提供的许多并行性。

但是,某些扩展模块(标准的或第三方的)被设计为在执行诸如压缩或散列之类的计算密集型任务时释放GIL。另外,在执行I / O时,始终释放GIL。

过去创建“自由线程”解释器(一种以更精细的粒度锁定共享数据的解释器)的努力并未成功,因为在常见的单处理器情况下性能会受到影响。相信克服该性能问题将使实施更加复杂,因此维护成本更高。

在这里专门对全局解释器锁的概念引入时说了这么一段话,第一指明了GIL造成了python解释器一次只有一个线程可以获取解释器锁,也就是解释器本身是自带锁的,谁先拿到谁就可以抢占到cpu的资源,

从而导致了python无论一个线程怎么去跑,都只能最多跑满一个cpu核心,就造成了多核cpu资源的无法利用的带来的资源浪费,但是这是否就意味着python一无是处呢,答案肯定No!,虽然GIL对于cpu密集的支持

不是那么的友好,但是,对于IO密集的支持恰恰是其他语言所无法比拟的,就拿asyncio这这个协程库来讲:https://docs.python.org/3/library/asyncio.html

1.第一部分认识多线程创建以及调用,上一节我讲解了源码关于多线程实现方式有两种:第一种通过Thread类传入可调用target对象,第二种继承Thread类并重写run方法:

下面就以target进行举例:

可以看到线程的资源抢占效果;证明GIL锁的的确真实存在的;

先在我们如果更换t.join()到t1.start()的后面会发现,线程每次不管怎么运行都是先执行完threading1线程,再去执行threading2线程,而这完全得益于joIn()函数:

我们来看源码是怎么解释join()的:

等待直到线程终止。这将阻塞调用线程,直到join()被调用方法的线程终止(正常或通过未处理的异常终止),或者直到发生可选的超时。

讲完join():

我们再来认识一个有趣的参数daemon->守护线程:

先看源码:

daemon用'来指示线程是否是守护线程,必须在线程start()方法调用之前设置,否则会引发RunTimeError,当不存在活动的非守护线程时将退出python程序

演示daemon:

正常默认daemon为False:

可以看到主线程运行结束后退出后子线程继续运行并输出了内容,

但是现在如果有个需求要求我们实现主线程退出后必须kill掉子线程那么,如何实现这个需求,这就用到了daemon,我们只需要设置为True:

主线程运行结束后并没有等待子线程

运行完毕就kill掉了子线程没有输出finsh打印就已经结束了子线程了

# 多线程实现方式二,继承Thread 类,重写run方法:

这是一种很基本的写法。实际开发过程我们会涉及到类的调用以及类的方法引用写法会发生改变:

这里实现了在线程外部定义一个类,其中类的方法test作为一个可调用对象传给了继承了Thread并重写run方法的MyCallable类,这里留一个思考题,对于以上重写run你会发现我们的run是无法实现结果回调的

这就意味着,我们需要根据实际场景使用不同的模块处理不同的需求,可以给大家一个小提示可以使用concurrent.futures或者使用  queue.Queue()来实现结果回调,因为在queue源码中,它是基于deque来实现的而deque是线程安全的也就意味queue也是线程安全的,有兴趣的可以自己去看下

j结语:

python threading2种调用方式实例的更多相关文章

  1. Python包模块化调用方式详解

    Python包模块化调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一般来说,编程语言中,库.包.模块是同一种概念,是代码组织方式. Python中只有一种模块对象类型 ...

  2. 【转】SVG与HTML、JavaScript的三种调用方式

    原文:https://www.cnblogs.com/guohu/p/5085045.html SVG与HTML.JavaScript的三种调用方式 一.在HTMl中访问SVG的DOM 1 2 3 4 ...

  3. 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍

    转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...

  4. 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

    1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:    ...

  5. python 线程的调用方式

    python 线程的调用方式 #!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/5/24 9:44 # ...

  6. Javascript中函数的四种调用方式

    一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...

  7. 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序

    在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...

  8. Vue组件的三种调用方式

    最近在写fj-service-system的时候,遇到了一些问题.那就是我有些组件,比如Dialog.Message这样的组件,是引入三方组件库,比如element-ui这样的,还是自己实现一个?虽然 ...

  9. magento 列表页显示产品属性值的几种调用方式

    之前有人提到要在列表显示一些特定的属性,除了自带的名字,价格等.因为列表页和产品页都有一个同名的产品对象:$_product,而在产品页,$_product是直接可以用$_product->ge ...

随机推荐

  1. linux 内核模块开发相关的文章搜集和模块开发过程中的小技巧

    最近需要开发一些内核模块,进行探究linux内核的一些特征,现在把一些遇到的比较好的文章和知识点,进行简要记录和备忘: 内核模块开发相关链接: https://www.thegeekstuff.com ...

  2. 邓Laravel2020-01-28

    ORM .一对一 hasOne $this->hasOne('外键的模型名称','外键的id','自己表里对应的id')// demo一对一 用户表里又area_id与地区表id一致 用户表和地 ...

  3. PMP--2.2 效益管理计划

    一.文件背景概述 ​​​1. 所需文件/数据 制定效益管理计划需要使用商业论证和需求评估中的数据和信息,例如,成本效益分析数据. 成本效益分析数据是在商业论证和需求评估中得到的,在成本效益分析中已经把 ...

  4. eclipse中一个项目引用另一个项目的方法

    我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门 ...

  5. 物联网开源框架Thingsboard使用总结

    Thingsboard中文社区:http://thingsboard.iotschool.com/ 参考网址:https://thingsboard.io/docs/getting-started-g ...

  6. 树莓派搭载CentOS7系统初始配置

    系统属性: 树莓派型号:3b SD:32GB 系统:CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1908-sda.raw 开机配置: 连接树莓派: 配件 ...

  7. Zabbix3.4使用详解

    zabbix-基础 第1章 关于zabbix 1.1 为什么要使用监控 1.对系统不间断实时监控2.实时反馈系统当前状态3.保证服务可靠性安全性4.保证业务持续稳定运行 1.2 如何进行监控 比如我们 ...

  8. Lua实现的八皇后问题

    来自<Lua程序与设计>第二节- 八皇后问题 输出所有解的解法 书中提供的源代码,加注了自己的注释. N = 8 --[[ N为棋盘规模 a为一维数组,保存第i个皇后所在的列数 ]] -- ...

  9. Expert C Programming(C专家编程) 读书笔记

    目录 几个比较奇葩的指针赋值 int (* fun())() int (* foo())[] int (*foo[])() const 关键词的意义是什么? char const (*next )() ...

  10. pgspider gzip fdw试用(集成gzip+http+graphql-engine)

    gzip 也是一个在实际中比较有用的处理工具,可以减少数据传输,以下是集成gzip http 以及plv8 的处理 gzip Docker 镜像 Dockerfile FROM dalongrong/ ...