当前位置: 首页 > news >正文

昆明市住房和城乡建设局网站怎么做外卖网站

昆明市住房和城乡建设局网站,怎么做外卖网站,app开发公司资质,正规网站建设空间python中有一个名为refchian的环状双向链表#xff0c;python运行时创建的所有对象都会添加到refchain中。在refchain中的对象PyObject里都有一个ob_refcnt用来保存当前对象的引用计数器#xff0c;就是该对象被引用的次数#xff0c;当对象有新引用时ob_refcnt就会增加python运行时创建的所有对象都会添加到refchain中。在refchain中的对象PyObject里都有一个ob_refcnt用来保存当前对象的引用计数器就是该对象被引用的次数当对象有新引用时ob_refcnt就会增加当引用他的对象被销毁时ob_refcnt就会减少。当引用计数器为0时该对象就会被销毁。 // python对象的核心结构体PyObject // 源码 Include/object.h #define PyObject_HEAD PyObject ob_base; #define PyObject_VAR_HEAD PyVarObject ob_base; // 构造一个双向链表 #define _PyObject_HEAD_EXTRA \ struct _object *_ob_next; \ struct _object *_ob_prev; typedef struct _object {_PyObject_HEAD_EXTRA // 构造双向链表Py_ssize_t ob_refcnt; // 引用计数器PyTypeObject *ob_type; // 数据类型 } PyObject;typedef struct {PyObject ob_base;Py_ssize_t ob_size; /* Number of items in variable part 列表、元组等元素的个数 */ } PyVarObject; // 对象创建时都会有PyObject列表、元组、字典、集合都会有PyVarObject一、引用计数器 Python通过引用计数来保存内存变量追踪记录该对象被其他使用的对象引用的次数内部有个跟踪变量叫做引用计数器每个变量有多少个引用简称引用计数。当某个引用计数为0时就列入了垃圾回收队列。 import sys a1 sys.getrefcount(a) # 2 # getrefcount返回变量的调用次数调用时内部会产生临时变量所以调用次数是21、引用计数增加的情况 1、一个对象被分配给一个新的变量 a 1, b a 2、对象被放入一个容器中 list.append(a) set.add(a) 3、对象被当作参数传到函数中 2、引用计数减少的情况 1、使用del 显示的删除对象 del a 2、对象所在的容易被删除 list[a, b] del list 3、引用超出作用域或者被重新赋值 a [1,2] a [3,4] 引用计数器的问题是不能解决两个对象相互引用和对象引用自己的情况del可以减少引用次数但计数不会归0。 3、GIL存在的关键因素 del 操作时先执行 DELETE_NAME将对象的的引用计数减1然后再判断对象的引用数是否为0如果为0会触发垃圾回收表面del 操作底层是有两步的。 import dis dis.dis(del a)1 0 DELETE_NAME 0 (a)2 LOAD_CONST 0 (None)4 RETURN_VALUE现在如果有两个线程A和线程B同时对data对象进行del data操作时线程A先执行 del data后执行了DELETE_NAME引用计数为0然后发生了CPU调度B线程执行也对data执行了del data结果发现data的引用计数已经为0 了就直接触发垃圾回收完了后又切换到线程A执行此时A也会继续判断data的引用数是否为0然后进行释放此时data就会变成野指针这就是二次释放。为了解决这种问题引入了GIL保证每一个时刻只有一个线程在解释器中执行并且会保证线程切换的时候会把当前的指令执行完再进行切换就不会发生二次释放的问题。 相同的问题Python的一个字节码可能会对应C中的多个函数调用GIL也会保证在线程切换时执行完当前的底层函数调用。 二、标记-清除 1、堆区和栈区 **堆 **Python中的大部分对象例如列表、字典、类实例以及小整数池、短字符缓存区、匿名列表对象缓存区、匿名字典对象缓存区都存储在堆内存中。堆内存用于存储动态分配的对象其大小通常由Python的内存管理器自动调整。当你创建一个新的对象时Python会在堆内存中分配内存空间来存储该对象。 栈 内存用于存储函数调用的上下文信息。每当你调用一个函数时其局部变量、函数参数、返回地址等信息都会被压入栈内存中。当函数执行完毕时这些信息会被从栈内存中弹出控制权返回到调用函数。 例子 data “hello world.” info data data “hello world.” 通俗的讲就是等号右边的值hello world.存在堆区而hello world.所处的内存地址是存在栈里的。data变量就是对hello world.对象的引用。 a [1, 2, 3] b [4, 5, 6] a.append(b) # a引用计数器为2 b.append(a) # b引用计数器为2 del a # a的引用计数器为1 del b # b的引用计数器为1 a和b存在循环引用当执行del操作后他们的计数器不会为0所以永远不会被消除如果代码中存在很多这种代码就会导致内存被耗尽程序崩溃。可能存在循环引用的类型有列表、元组、字典、集合、自定义类等 2、标记 垃圾回收器会使用深度优先搜索来遍历当前程序的所有栈区引用的对象将遍历到的对象标记为存活表示可以访问到。标记一个对象后垃圾回收器会继续遍历该对象引用的其他对象。 扩展什么是三色标记算法 3、清除 当所有的对象都标记完时垃圾回收器会扫描整个堆区清除没有被标记的对象这些对象都是没有被栈区引用的这些对象就是要被清除的对象。 4、什么情况下会触发标记-清除呢 垃圾回收阶段会暂停程序等标记清除后才会恢复程序运行为了减少程序的暂停时间python通过分代回收以空间换时间提高垃圾回收效率。 三、分代回收 python将可能存在循环引用的容器对象内部可以引用其他对象的对象PyListObject、PyDictObject、自定义类对象、自定义类对象的实例对象拆分成3个链表分别为0代、1代、2代总共三代每代都有可以存对象和阈值当达到阈值时就会扫描链表将循环引用各自减一、销毁计数器为0的对象当第0代扫描后存活下来的对象会被移到第1代在第1代存活下来的对象会被移到第2代可以简单的理解为对象存在时间越长越可能不是垃圾应该越少去收集。 // 源码 Modules/gcmodule.c struct gc_generation generations[NUM_GENERATIONS] { /* PyGC_Head, threshold, count */ {{(uintptr_t)_GEN_HEAD(0), (uintptr_t)_GEN_HEAD(0)}, 700, 0}, {{(uintptr_t)_GEN_HEAD(1), (uintptr_t)_GEN_HEAD(1)}, 10, 0}, {{(uintptr_t)_GEN_HEAD(2), (uintptr_t)_GEN_HEAD(2)}, 10, 0}, }// python源码 import gc gc.get_threshold() ## 分代回收机制的参数阈值设置 (700, 10, 10)1、这种对象新创建的时候就会被加入到0代链表上当0代链表上的对象数大于700时就开始扫描0代链表。此时如果2、1代未达到阈值则扫描0代并将1代的count值加1如果2代已经达到阈值则将2、1、0代三个链表拼接起来进行扫描并将2、1、0代的count值置为0如果1代已经达到阈值则将1、0两个链表拼接起来进行扫描并将1、0代的count值置为0。 2、当第0代被扫描10次时则第1代开始扫描。 3、当第1代被扫描10次时则第2代开始扫描。 对拼接起来的链表在进行扫描时主要就是剔除循环引用和销毁垃圾详细过程为 扫描链表把每个对象的引用计数器拷贝一份并保存到 gc_refs中保护原引用计数器。再次扫描链表中的每个对象并检查是否存在循环引用如果存在则让各自的gc_refs减 1 。再次扫描链表将 gc_refs 为 0 的对象移动到unreachable链表中不为0的对象直接升级到下一代链表中。处理unreachable链表中的对象的 析构函数 和 弱引用不能被销毁的对象升级到下一代链表能销毁的保留在此链表。 析构函数指的就是那些定义了__del__方法的对象需要执行之后再进行销毁处理。弱引用 最后将 unreachable 中的每个对象销毁并在refchain链表中移除不考虑缓存机制。 四、弱引用 弱引用与普通引用不同弱引用不会增加被引用对象的引用计数因此不会阻止对象被回收。在Python中可以使用weakref模块来创建和操作弱引用弱引用的主要用途是解决循环引用问题。 1、支持弱引用的对象 对于list、dict、str本身不支持弱引用但可以通过创建子类的方式对其进行弱引用对于int、tuple本身及其子类均不支持弱引用set直接支持弱引用。 import sys import weakref a {1,2,3} b a sys.getrefcount(a) # 3 a被引用的3次c weakref.ref(a) # 对a进行弱引用 引用次数不会增加 sys.getrefcount(a) # 3
http://www.sadfv.cn/news/34138/

相关文章:

  • 中国建设银行汕头支行网站wordpress tdk设置
  • 濮阳网站建设熊掌号免费网络短剧网站
  • 网站建设芜湖上海网站建设市场
  • 做网站卖菜刀需要什么手续网站建设及推广文案
  • 哪些外贸网站比较好附近学电脑在哪里报名
  • 网站设计上市公司做网站seo
  • 建一个做笔记的网站傻瓜式网页制作工具
  • 常州做的网站的公司哪家好专门做二手书网站或app
  • 深圳 德 网站建设视频 收费 网站怎么做
  • 包头建设厅官方网站asp.net网站开发介绍
  • 如何网站做淘客如何用wordpress主题
  • wordpress建站环境网站建设一般报价多少钱
  • wordpress行业主题上海网站优化上
  • 东营市垦利区胜坨填建设站的网站公司网页首页图片
  • 建设一个类似于京东的网站把html变成wordpress主题
  • 南宁优化网站网络服务2017常用的网站
  • 做网站那个平台好推软件
  • 贵阳网站建设哪家便宜网站内部链接导向
  • 厦门市湖里区建设局网站新手如何注册网站域名
  • 工具类网站做排名个人网页英文
  • 做网站每个月可以赚多少网站后台数据库丢失
  • 硬件开发网站十大经典营销案例
  • 在网站上做教育直播平台多少钱网页设计与制作题目
  • 网站开发过程的分工电子商务有哪些职业
  • 网站如何注销美术教师网站建设心得体会
  • 四川住房和城乡建设厅网站首页优秀flash网站设计
  • 网站重构南宁seo诊断
  • 建设银行+贷款+查询+网站98建筑人才网
  • 宁波外贸网站设计公司wordpress 站长统计插件
  • 网站制作平台能赚钱吗代理一款网页游戏需要多少钱