近期看了一些关于GIL的一些内容,敲一下代码看看效果。

# coding:utf-8
# GIL(Global Interpreter Lock):他只允许任何时刻只有一个线程处于执行状态,即使是在具有多个CPU内核的多线程架构中。
# 为什么没有删除GIL,因为现在的python已经严重依赖GIL提供的解决方案。如果删除会破坏现有的C扩展。(free threading 就是删除的案例,他会导致单线程任务速度降低40%。)
# 释放GIL:以前版本是采用计数策略删除,如果该线程计数为0,则删除。现在采用固定时间间隔,到了时间点就删除。
import time
from threading import Thread
from multiprocessing import Pool
Count = 50000000
def countdown(n):
while n>0:
n-=1
if __name__ == "__main__":
# 不采用多进程和多线程
start1 = time.time()
countdown(Count)
end1 = time.time()
print("2:", end1 - start1) # 2.538 # 采用多线程
# t1 = Thread(target=countdown, args=(Count // 2,))
# t2 = Thread(target=countdown, args=(Count // 2,))
# start = time.time()
# t1.start()
# t2.start()
# t1.join() # join 所完成的工作就是线程同步,即主线程任务结束以后,进入堵塞状态,一直等待所有的子线程结束以后,主线程再终止
# t2.join() # 至于为什么,我觉得可能是为了防止同一时刻有多个线程访问资源。
# end = time.time()
# print("1:", end - start) # 2.717 # 采用多进程
# pool = Pool(processes=2)
# start2 = time.time()
# r1 = pool.apply_async(countdown, [Count//2])
# r2 = pool.apply_async(countdown, [Count//2])
# pool.close()
# pool.join()
# end2 = time.time()
# print("3:",end2-start2) # 1.617

结果发现,采用多进程的确会好点。

对于python中GIL的一些理解与代码实现的更多相关文章

  1. 对 Python 中 GIL 的一点理解

    GIL(Global Interpreter Lock),全局解释器锁,是 CPython 为了避免在多线程环境下造成 Python 解释器内部数据的不一致而引入的一把锁,让 Python 中的多个线 ...

  2. Python中GIL

    GIL(global interpreter lock)全局解释器锁 python中GIL使得同一个时刻只有一个线程在一个cpu上执行,无法将多个线程映射到多个cpu上执行,但GIL并不会一直占有,它 ...

  3. python中对多态的理解

    目录 python中对多态的理解 一.多态 二.多态性 三.鸭子类型 python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多 ...

  4. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  5. Python中“if __name__=='__main__':”理解与总结

    1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ...

  6. 对于Python中回调函数的理解

    关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...

  7. python中GIL和线程与进程

    线程与全局解释器锁(GIL) 一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...

  8. Python中的strip()的理解

    在看到Python中strip的时候产生了疑问 strip() 用于移除字符串头尾指定的字符(默认为空格) 开始测试: >>> s = 'ncy_123.python' >&g ...

  9. 对python中的__name__的理解

    一开始学习python的时候,不理解python中的__name__的用途,一致感觉__name__的返回结果就是__main__ 今天系统的看了一下,才理解过来,__name__真正的用处是用在使用 ...

  10. 对python中元类的理解

    1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object): ...

随机推荐

  1. OpenStack 基本命令

    keystone source /etc/keystone/admin-openrc.sh #登录 openstack user create --password ps1234 --email hq ...

  2. Vue Hook 封装通用型表格

    一.创建通用型表格的需求 实现一个通用型表格组件,具备以下功能: 动态列配置. 分页功能. 排序功能. 可扩展的行操作功能. 二.设计通用型表格组件 首先,需要设计一个基础的表格组件,它接受列配置.数 ...

  3. 【MySQL】LEFT JOIN 踩坑

    一.问题发现: 主查询功能发现两条一样的记录,但是审批状态不一样,一个已通过,一个待审核 主表付款表: CREATE TABLE `pur_or_payment` ( `id` int(11) NOT ...

  4. 【Uni-App】其他配置笔记

    manifest.json manifest.json 文件是应用的配置文件,用于指定应用的名称.图标.权限等.HBuilderX 创建的工程此文件在根目录,CLI 创建的工程此文件在 src 目录. ...

  5. 【转载】ubuntu用户/linux用户登录后没有自动加载.bashrc

    版权声明:本文为CSDN博主「安安爸Chris」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/mimiduc ...

  6. 外文论文同行评审平台——PubPeer——论文打假平台

    参考: https://baijiahao.baidu.com/s?id=1757051752090030001&wfr=spider&for=pc ================= ...

  7. (续) MindSpore 如何实现一个线性回归 —— Demo示例

    前文: https://www.cnblogs.com/devilmaycry812839668/p/14975860.html 前文中我们使用自己编写的损失函数和单步梯度求导来实现算法,这里是作为扩 ...

  8. java本地增量打包工具

    在打增量包每次都需要将class文件.jsp文件等拷贝到增量包中比较麻烦.所以就写了一个增量打包工具. 工作原理:根据文件的最后修改时间来打增量. 1.查找Java类增量:根据eclipse工程下的. ...

  9. 别再被坑了! JavaScript类型检测的最佳实践

    别再被坑了! JavaScript类型检测的最佳实践 在 JavaScript 中,我们经常需要判断一个变量的类型.这个需求在编程中非常常见,因为不同类型的数据会影响到我们的代码逻辑. JavaScr ...

  10. WPF:MVVM的由来与属性绑定的过程

    WPF:MVVM的由来与属性绑定的过程 1.MVVM (1)MVVM是什么? ​ MVVM(Model-View-ViewModel)是一种软件架构设计模式MVVM模式.有助于分离应用程序的业务逻辑和 ...