欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

CPython 中的垃圾收集器

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

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

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

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

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

import gc

檢測循環(huán)引用

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

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

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

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

用戶定義的類的任何實例也將被垃圾收集器跟蹤,因為我們總是可以在它們身上設(shè)置任意的屬性(指針)。

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

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

它也知道每個對象中的所有指針,以及它們所指向的位置。我們可以看到這個動作。

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

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

讓我們在一個對象的循環(huán)中看看 get_referents 方法(雖然還不是一個循環(huá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__

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

當(dāng)垃圾收集器運行時,它檢查它所知道的每個對象(也就是當(dāng)你調(diào)用 gc.is_tracked 時返回True的任何對象)是否可以從命名空間到達(dá)。它通過跟蹤來自命名空間的所有指針,以及這些指針?biāo)赶虻膶ο笾械闹羔槪源祟愅?,直到它建立起所有可從代碼中訪問的東西的整個視圖。

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

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

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

>>> del jane
>>> del bob

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

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

默認(rèn)情況下,垃圾收集器會每隔一段時間自動執(zhí)行這個動作(因為越來越多的對象在CPython運行時被創(chuàng)建和銷毀)。

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

參考鏈接:

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

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

相關(guān)文章

  • Python對兩個有序列表進(jìn)行合并和排序的例子

    Python對兩個有序列表進(jìn)行合并和排序的例子

    這篇文章主要介紹了Python對兩個有序列表進(jìn)行合并和排序的例子,最終代碼經(jīng)過不斷優(yōu)化,小編非常滿意,需要的朋友可以參考下
    2014-06-06
  • Python中輸出ASCII大文字、藝術(shù)字、字符字小技巧

    Python中輸出ASCII大文字、藝術(shù)字、字符字小技巧

    這篇文章主要介紹了Python中輸出ASCII大文字、藝術(shù)字、字符字小技巧,本文首先給出了ASCII大文字、藝術(shù)字、字符字的圖片效果,然后給出了Python中的實現(xiàn)方法,需要的朋友可以參考下
    2015-04-04
  • 一文教你徹底解決Python包下載慢問題

    一文教你徹底解決Python包下載慢問題

    在利用python中,我們經(jīng)常需要使用到各種各樣的庫。其中,pip是我們常用的安裝工具,一般情況下我們基本上是直接pip方法安裝第三方包,下面這篇文章主要給大家介紹了關(guān)于如何徹底解決Python包下載慢問題的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Django如何自定義分頁

    Django如何自定義分頁

    這篇文章主要為大家詳細(xì)介紹了Django自定義分頁的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Python 實現(xiàn)數(shù)據(jù)結(jié)構(gòu)-循環(huán)隊列的操作方法

    Python 實現(xiàn)數(shù)據(jù)結(jié)構(gòu)-循環(huán)隊列的操作方法

    這篇文章主要介紹了Python 實現(xiàn)數(shù)據(jù)結(jié)構(gòu)-循環(huán)隊列的操作方法,需要的朋友可以參考下
    2019-07-07
  • python線程池 ThreadPoolExecutor 的用法示例

    python線程池 ThreadPoolExecutor 的用法示例

    這篇文章主要介紹了python線程池 ThreadPoolExecutor 的用法示例,幫助大家更好得理解和使用python線程池,感興趣的朋友可以了解下
    2020-10-10
  • Python圖像處理之圖像拼接

    Python圖像處理之圖像拼接

    這篇文章主要介紹了Python圖像處理之圖像拼接,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python圖像處理的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 使用Python實現(xiàn)七大排序算法的代碼實例

    使用Python實現(xiàn)七大排序算法的代碼實例

    這篇文章主要介紹了使用Python實現(xiàn)七大排序算法的代碼實例,所謂排序,就是使一串記錄,按照其中的某個或某些關(guān)鍵字的大小,遞增或遞減的排列起來的操作,需要的朋友可以參考下
    2023-07-07
  • Python處理和解析CLIXML數(shù)據(jù)的方法

    Python處理和解析CLIXML數(shù)據(jù)的方法

    在使用Windows的Windows Remote Management (WinRM)服務(wù)與PowerShell交互時,經(jīng)常會遇到CLIXML(即CLI XML)格式的數(shù)據(jù),本文將介紹如何在Python中處理和解析CLIXML數(shù)據(jù),并提供一種方法來從數(shù)據(jù)中提取有效信息,需要的朋友可以參考下
    2024-04-04
  • Python Socket編程詳細(xì)介紹

    Python Socket編程詳細(xì)介紹

    這篇文章主要介紹了Python Socket編程詳細(xì)介紹,socket可以建立連接,傳遞數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03

最新評論