最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

CPython 垃圾收集器檢測(cè)循環(huán)引用詳解

 更新時(shí)間:2022年10月07日 12:17:33   作者:宇宙之一粟  
這篇文章主要為大家介紹了CPython 垃圾收集器檢測(cè)循環(huán)引用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

CPython 中的垃圾收集器

CPython 的垃圾收集器(簡(jiǎn)稱(chēng)GC)是 Python 內(nèi)置的為了解決循環(huán)引用問(wèn)題的方法。默認(rèn)情況下,它總是在后臺(tái)運(yùn)行,并且每隔一段時(shí)間就會(huì)發(fā)揮它的魔力,所以你不必?fù)?dān)心循環(huán)引用物會(huì)堵塞你的內(nèi)存。

垃圾收集器被設(shè)計(jì)為從 CPython 的工作內(nèi)存中找到并刪除循環(huán)引用對(duì)象。它通過(guò)以下方式完成這一工作。

  • 檢測(cè)循環(huán)引用的對(duì)象
  • 調(diào)用最終的 __del__ 方法
  • 它從每個(gè)對(duì)象中刪除指針(以此來(lái)解決循環(huán)問(wèn)題),只有當(dāng)循環(huán)在步驟 2 之后仍然是孤立的

在這個(gè)過(guò)程完成后,以前在循環(huán)中的每個(gè)對(duì)象現(xiàn)在的引用計(jì)數(shù)都是 0 ,因此此對(duì)象將從內(nèi)存中刪除。

雖然它是自動(dòng)工作的,但實(shí)際上我們可以把它作為一個(gè)模塊從標(biāo)準(zhǔn)庫(kù)中導(dǎo)入。舉例如下:

import gc

檢測(cè)循環(huán)引用

CPython 的垃圾收集器會(huì)跟蹤內(nèi)存中存在的各種對(duì)象--但不是所有的對(duì)象。我們可以實(shí)例化一些對(duì)象,看看垃圾收集器是否會(huì)收集它們。

>>> gc.is_tracked("a string")
False
>>> gc.is_tracked(["a", "list"])
True

如果一個(gè)對(duì)象可以包含指針,這就使它有能力形成循環(huán)引用結(jié)構(gòu)的一部分--而這正是垃圾檢測(cè)器存在的目的,即檢測(cè)和拆除。在 Python 中這樣的對(duì)象通常被稱(chēng)為 "容器對(duì)象"。

所以,垃圾收集器需要知道任何有可能作為循環(huán)引用的一部分而存在的對(duì)象。字符串不能,所以 "一個(gè)字符串 "不會(huì)被垃圾收集器追蹤。列表(正如我們已經(jīng)看到的)能夠包含指針,因此 ['a', 'list'] 被跟蹤。

用戶定義的類(lèi)的任何實(shí)例也將被垃圾收集器跟蹤,因?yàn)槲覀兛偸强梢栽谒鼈兩砩显O(shè)置任意的屬性(指針)。

>>> Wade = MyNameClass("Wade")
>>> gc.is_tracked(Wade)
True

所以,垃圾收集器知道所有有可能形成循環(huán)引用的對(duì)象。它怎么知道是否已經(jīng)形成循環(huán)引用呢?

它也知道每個(gè)對(duì)象中的所有指針,以及它們所指向的位置。我們可以看到這個(gè)動(dòng)作。

>>> my_list = ["a", "list"]
>>> gc.get_referents(my_list)
['list', 'a']

get_referents 方法(也稱(chēng)為遍歷方法)接收一個(gè)對(duì)象,并返回它所包含的對(duì)象指針的列表(它的引用)。因此,上面的列表包含指向其每個(gè)元素的指針,這些元素都是字符串。

讓我們?cè)谝粋€(gè)對(duì)象的循環(huán)中看看 get_referents 方法(雖然還不是一個(gè)循環(huán)引用,因?yàn)檫@些對(duì)象仍然可以從命名空間中被訪問(wèn))。

>>> jane = MyNamedClass("Jane")
>>> bob = MyNamedClass("Bob")
>>> jane.friend = bob
>>> bob.friend = jane
>>> gc.get_referents(bob)
[{'name': 'bob', 'friend': <__main__.MyNamedClass object at 0x7ff29a095d60>}, <class '__main__

在這個(gè)循環(huán)中,我們可以看到由 bob 指向的對(duì)象包含指向以下內(nèi)容的指針:它的屬性字典,包含 bob 的名字 (bob) 和它的朋友 (同樣由 jane 指向的 MyNamedClass 實(shí)例) 。bob 對(duì)象也有一個(gè)指向類(lèi)對(duì)象本身的指針,因?yàn)?bob.class 將返回那個(gè)類(lèi)對(duì)象。

當(dāng)垃圾收集器運(yùn)行時(shí),它檢查它所知道的每個(gè)對(duì)象(也就是當(dāng)你調(diào)用 gc.is_tracked 時(shí)返回True的任何對(duì)象)是否可以從命名空間到達(dá)。它通過(guò)跟蹤來(lái)自命名空間的所有指針,以及這些指針?biāo)赶虻膶?duì)象中的指針,以此類(lèi)推,直到它建立起所有可從代碼中訪問(wèn)的東西的整個(gè)視圖。

如果在做完這些之后,GC 發(fā)現(xiàn)存在一些不能從命名空間到達(dá)的對(duì)象,那么它可以把這些對(duì)象清除掉。

記住,任何仍在內(nèi)存中的對(duì)象必須有一個(gè)非零的引用計(jì)數(shù),否則它們會(huì)因?yàn)橐糜?jì)數(shù)而被刪除。對(duì)于那些無(wú)法到達(dá)但仍有非零引用計(jì)數(shù)的對(duì)象,它們必須是循環(huán)引用的一部分,這就是為什么我們?nèi)绱岁P(guān)心這些發(fā)生的可能性。

讓我們回到引用循環(huán),jane 和 bob,通過(guò)從命名空間中移除指針,把這個(gè)循環(huán)變成一個(gè)循環(huán)的隔離。

>>> del jane
>>> del bob

現(xiàn)在,我們已經(jīng)了解了垃圾收集器所要解決的確切情況。我們可以通過(guò)調(diào)用 gc.collect() 來(lái)觸發(fā)手動(dòng)垃圾收集。

>>> gc.collect()
Deleting Bob!
Deleting Jane!
4

默認(rèn)情況下,垃圾收集器會(huì)每隔一段時(shí)間自動(dòng)執(zhí)行這個(gè)動(dòng)作(因?yàn)樵絹?lái)越多的對(duì)象在CPython運(yùn)行時(shí)被創(chuàng)建和銷(xiāo)毀)。

在上面的代碼片段中,我們看到的輸出包含了來(lái)自 MyNamClass 的 __del__ 方法的打印語(yǔ)句,在最后有一個(gè)數(shù)字--在這個(gè)例子中,是 4。 這個(gè)數(shù)字是由垃圾收集器本身輸出的,它告訴我們有多少對(duì)象被移除。

參考鏈接:

https://anvil.works/articles/pointers-in-my-python-3

以上就是CPython 垃圾收集器檢測(cè)循環(huán)引用詳解的詳細(xì)內(nèi)容,更多關(guān)于CPython 垃圾收集器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Jupyter notebook中如何添加Pytorch運(yùn)行環(huán)境

    Jupyter notebook中如何添加Pytorch運(yùn)行環(huán)境

    這篇文章主要介紹了Jupyter notebook中如何添加Pytorch運(yùn)行環(huán)境,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python+Turtle繪制可愛(ài)的小蜜蜂詳解

    Python+Turtle繪制可愛(ài)的小蜜蜂詳解

    turtle庫(kù)是一個(gè)點(diǎn)線面的簡(jiǎn)單圖像庫(kù),在Python2.6之后被引入進(jìn)來(lái),能夠完成一些比較簡(jiǎn)單的幾何圖像可視化。本文將利用turtle繪制一個(gè)可愛(ài)的小蜜蜂,感興趣的可以試一試
    2022-05-05
  • python scatter散點(diǎn)圖用循環(huán)分類(lèi)法加圖例

    python scatter散點(diǎn)圖用循環(huán)分類(lèi)法加圖例

    這篇文章主要為大家詳細(xì)介紹了python scatter散點(diǎn)圖用循環(huán)分類(lèi)法加圖例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Python對(duì)Excel進(jìn)行處理的實(shí)操指南

    Python對(duì)Excel進(jìn)行處理的實(shí)操指南

    這篇文章主要給大家介紹了關(guān)于Python對(duì)Excel進(jìn)行處理的實(shí)操指南,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python學(xué)習(xí)之基礎(chǔ)語(yǔ)法介紹

    Python學(xué)習(xí)之基礎(chǔ)語(yǔ)法介紹

    大家好,本篇文章主要講的是Python學(xué)習(xí)之基礎(chǔ)語(yǔ)法介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • pip install 使用國(guó)內(nèi)鏡像的方法示例

    pip install 使用國(guó)內(nèi)鏡像的方法示例

    這篇文章主要介紹了pip install 使用國(guó)內(nèi)鏡像的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 一篇文章看懂python如何執(zhí)行cmd命令

    一篇文章看懂python如何執(zhí)行cmd命令

    這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章看懂python如何執(zhí)行cmd命令的相關(guān)資料,在Python中可以使用多種方法執(zhí)行cmd命令,文中通過(guò)代碼示例將每種方法都介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • python每天定時(shí)運(yùn)行某程序代碼

    python每天定時(shí)運(yùn)行某程序代碼

    這篇文章主要介紹了python每天定時(shí)運(yùn)行某程序代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python數(shù)字圖像處理像素的訪問(wèn)與裁剪示例

    python數(shù)字圖像處理像素的訪問(wèn)與裁剪示例

    這篇文章主要為大家介紹了python數(shù)字圖像處理像素的訪問(wèn)與裁剪示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Tkinter canvas的畫(huà)布參數(shù),刪除組件,添加垂直滾動(dòng)條詳解

    Tkinter canvas的畫(huà)布參數(shù),刪除組件,添加垂直滾動(dòng)條詳解

    這篇文章主要介紹了python tkinter 畫(huà)布參數(shù),刪除組件,添加垂直滾動(dòng)條使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

永德县| 辉南县| 嘉鱼县| 龙游县| 江达县| 乌恰县| 南投市| 陵水| 屏边| 柯坪县| 平山县| 沽源县| 疏勒县| 长宁县| 济阳县| 芜湖县| 榆社县| 陆良县| 宁波市| 呼伦贝尔市| 聊城市| 东乡| 永福县| 宿松县| 吐鲁番市| 惠州市| 博客| 东乡县| 广灵县| 高台县| 同江市| 廉江市| 横峰县| 麦盖提县| 黔西县| 澄迈县| 调兵山市| 佛教| 肥乡县| 嘉祥县| 南漳县|