对于python中GIL的一些理解与代码实现
近期看了一些关于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的一些理解与代码实现的更多相关文章
- 对 Python 中 GIL 的一点理解
GIL(Global Interpreter Lock),全局解释器锁,是 CPython 为了避免在多线程环境下造成 Python 解释器内部数据的不一致而引入的一把锁,让 Python 中的多个线 ...
- Python中GIL
GIL(global interpreter lock)全局解释器锁 python中GIL使得同一个时刻只有一个线程在一个cpu上执行,无法将多个线程映射到多个cpu上执行,但GIL并不会一直占有,它 ...
- python中对多态的理解
目录 python中对多态的理解 一.多态 二.多态性 三.鸭子类型 python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Python中“if __name__=='__main__':”理解与总结
1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ...
- 对于Python中回调函数的理解
关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...
- python中GIL和线程与进程
线程与全局解释器锁(GIL) 一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...
- Python中的strip()的理解
在看到Python中strip的时候产生了疑问 strip() 用于移除字符串头尾指定的字符(默认为空格) 开始测试: >>> s = 'ncy_123.python' >&g ...
- 对python中的__name__的理解
一开始学习python的时候,不理解python中的__name__的用途,一致感觉__name__的返回结果就是__main__ 今天系统的看了一下,才理解过来,__name__真正的用处是用在使用 ...
- 对python中元类的理解
1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object): ...
随机推荐
- 对比python学julia(第二章)--(第一节)隔沟算样—枚举策略
1.1. 问题描述 在明代数学家程大位的<算法统宗>著作中记载了这样一道数学题: 甲乙隔沟放牧,二人暗里参详. 甲云得乙九个羊,多你一倍之上. 乙说得甲九只,两家之数相当. 两边闲坐恼心 ...
- 【Java】JDBC Part2 工具类封装实现
JDBC 工具类封装实现 - 注册和配置都放在静态代码块完成 - 静态方法获取连接,和释放资源 - 本类不产生实例 - 5版本 + 已经可以实现无驱动注册,所以驱动部分注释了 package cn.d ...
- 【JavaScript】无框架翻页处理
这个业务太复杂了 输入框的东西要用接口查出来,居然不是用户手动输入 然后我就要做一个翻页的查询列表: <div form id="troublePartSearch" sty ...
- Efficientvit: Enhanced linear attention for high-resolution low-computation visual recognition
GitHub地址: https://github.com/mit-han-lab/efficientvit#usage 相关: https://www.jetson-ai-lab.com/vit/tu ...
- rllab —— 强化学习 算法模块库 (环境配置失败!!!) (已经不进行维护更新,已被淘汰,由于一些老旧代码还有可能关联因此fork了下,复制了份原始项目)
代码地址: https://gitee.com/devilmaycry812839668/rllab 由于官方代码地址在github上,外网偶尔会出现网络连接中断的问题因此在国内代码库中fork了一个 ...
- 为什么被要求避免使用orcid
前段时间收到了最高机构的通知,要求不要使用orcid,并对之前使用的情况进行自查.得到这个通知,我其实还是蛮无感的,毕竟我一篇论文也没法过,而且也没有用过这个orcid,虽然我自己也是有这个的. 关于 ...
- 记录一次实验室linux系统的GPU服务器死机排查过程——某显卡满负荷导致内核进程超时导致系统死机
在自己没有管理多台高负荷的ubuntu显卡服务器之前,我是万万想不到linux服务器居然也是如此容易死机的. 什么每个版本的TensorFlow调用显卡驱动时和内核不兼容,什么系统自动升级导致的显卡驱 ...
- 零基础学虚幻4(UE4):蓝图+VR 丁树凯教程
本人正在学习中,需要资料或者讨论问题的加Q:1241642375
- 我是如何使用 vue2+element-ui 处理负责表单,避免单文件过大的问题
引言 在工作中我经常需要处理一些复杂.动态表单,但是随着需求不断迭代,我们也许会发现曾经两三百行的.vue文件现在不知不觉到了两千行,三千行,甚至更多... 这对于一个需要长期维护的项目,无疑是增加了 ...
- Git删除当前分支下的所有历史版本与log