Hướng dẫn gc.disable python - gc.disable python


Mô -đun này cung cấp một giao diện cho bộ thu rác tùy chọn. Nó cung cấp khả năng vô hiệu hóa bộ thu, điều chỉnh tần số thu thập và đặt các tùy chọn gỡ lỗi. Nó cũng cung cấp quyền truy cập vào các đối tượng không thể truy cập mà người thu thập tìm thấy nhưng không thể tự do. Vì bộ thu bổ sung, việc đếm tham chiếu đã được sử dụng trong Python, bạn có thể vô hiệu hóa bộ thu nếu bạn chắc chắn rằng chương trình của bạn không tạo các chu kỳ tham chiếu. Thu thập tự động có thể được vô hiệu hóa bằng cách gọi gc.disable(). Để gỡ lỗi một chương trình bị rò rỉ, hãy gọi gc.set_debug(gc.DEBUG_LEAK). Lưu ý rằng điều này bao gồm gc.DEBUG_SAVEALL, khiến các đối tượng được thu thập rác được lưu trong GC.GARBAGE để kiểm tra.

Mô -đun gc cung cấp các chức năng sau:

gc.enable () ¶enable()

Bật bộ sưu tập rác tự động.

gc.disable ()disable()

Tắt bộ sưu tập rác tự động.

gc.isenables () ¶isenabled()

Trả về True nếu bộ sưu tập tự động được bật.

gc.Collect (thế hệ = 2) ¶collect(generation=2)

Không có lập luận, chạy một bộ sưu tập đầy đủ. Tạo đối số tùy chọn có thể là một số nguyên chỉ định thế hệ sẽ thu thập (từ 0 đến 2). Một ValueError được nâng lên nếu số thế hệ không hợp lệ. Số lượng các đối tượng không thể truy cập được tìm thấy được trả về.

Các danh sách miễn phí được duy trì cho một số loại tích hợp được xóa bất cứ khi nào một bộ sưu tập đầy đủ hoặc bộ sưu tập của thế hệ cao nhất (2) được chạy. Không phải tất cả các mục trong một số danh sách miễn phí có thể được giải phóng do thực hiện cụ thể, đặc biệt là float.

gc.set_debug (cờ) ¶set_debug(flags)

Đặt cờ gỡ lỗi bộ sưu tập rác. Thông tin gỡ lỗi sẽ được ghi vào sys.stderr. Xem bên dưới để biết danh sách các cờ gỡ lỗi có thể được kết hợp bằng cách sử dụng các hoạt động bit để kiểm soát gỡ lỗi.

gc.get_debug () ¶get_debug()

Trả lại các cờ gỡ lỗi hiện đang được đặt.

gc.get_objects (thế hệ = không) ¶get_objects(generation=None)

Trả về một danh sách tất cả các đối tượng được theo dõi bởi người thu thập, không bao gồm danh sách được trả về. Nếu thế hệ không phải là không, chỉ trả lại các đối tượng được theo dõi bởi người thu thập trong thế hệ đó.

Thay đổi trong phiên bản 3.8: Tham số thế hệ mới.New generation parameter.

Tăng một sự kiện kiểm toán

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
0 với đối số
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
1.auditing event
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
0 with argument
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
1.

gc.get_stats () ¶get_stats()

Trả về một danh sách ba từ điển mỗi thế hệ chứa thống kê thu thập kể từ khi thông dịch viên bắt đầu. Số lượng khóa có thể thay đổi trong tương lai, nhưng hiện tại mỗi từ điển sẽ chứa các mục sau:

  • >>> x = None
    >>> class Lazarus:
    ...     def __del__(self):
    ...         global x
    ...         x = self
    ...
    >>> lazarus = Lazarus()
    >>> gc.is_finalized(lazarus)
    False
    >>> del lazarus
    >>> gc.is_finalized(x)
    True
    
    2 là số lần thế hệ này được thu thập;

  • >>> x = None
    >>> class Lazarus:
    ...     def __del__(self):
    ...         global x
    ...         x = self
    ...
    >>> lazarus = Lazarus()
    >>> gc.is_finalized(lazarus)
    False
    >>> del lazarus
    >>> gc.is_finalized(x)
    True
    
    3 là tổng số đối tượng được thu thập trong thế hệ này;

  • >>> x = None
    >>> class Lazarus:
    ...     def __del__(self):
    ...         global x
    ...         x = self
    ...
    >>> lazarus = Lazarus()
    >>> gc.is_finalized(lazarus)
    False
    >>> del lazarus
    >>> gc.is_finalized(x)
    True
    
    4 là tổng số đối tượng được tìm thấy là không thể kiểm soát được (và do đó được chuyển đến danh sách
    >>> x = None
    >>> class Lazarus:
    ...     def __del__(self):
    ...         global x
    ...         x = self
    ...
    >>> lazarus = Lazarus()
    >>> gc.is_finalized(lazarus)
    False
    >>> del lazarus
    >>> gc.is_finalized(x)
    True
    
    5) bên trong thế hệ này.

Mới trong phiên bản 3.4.

gc.set_threshold (ngưỡng0 [, ngưỡng1 [, ngưỡng2]]) ¶set_threshold(threshold0[, threshold1[, threshold2]])

Đặt ngưỡng thu gom rác (tần số thu thập). Cài đặt Ngưỡng0 thành Zero vô hiệu hóa Bộ sưu tập.

GC phân loại các đối tượng thành ba thế hệ tùy thuộc vào số lượng bộ sưu tập họ đã sống sót. Các đối tượng mới được đặt trong thế hệ trẻ nhất (Thế hệ

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
6). Nếu một đối tượng tồn tại một bộ sưu tập, nó sẽ được chuyển sang thế hệ cũ hơn tiếp theo. Vì thế hệ
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
7 là thế hệ lâu đời nhất, các đối tượng trong thế hệ đó vẫn ở đó sau một bộ sưu tập. Để quyết định khi nào nên chạy, người thu thập theo dõi các phân bổ đối tượng và giao dịch số kể từ bộ sưu tập cuối cùng. Khi số lượng phân bổ trừ đi số lượng giải quyết vượt quá ngưỡng0, bộ sưu tập bắt đầu. Ban đầu chỉ có thế hệ
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
6 được kiểm tra. Nếu thế hệ
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
6 đã được kiểm tra nhiều hơn ngưỡng1 lần kể từ khi thế hệ gc.disable()0 đã được kiểm tra, thì thế hệ gc.disable()0 cũng được kiểm tra. Với thế hệ thứ ba, mọi thứ phức tạp hơn một chút, xem việc thu thập thế hệ lâu đời nhất để biết thêm thông tin.

gc.get_count () ¶get_count()

Trả lại bộ sưu tập hiện tại được tính là một bộ giảm 522.

gc.get_threshold () ¶get_threshold()

Trả về các ngưỡng bộ sưu tập hiện tại dưới dạng bộ giảm 53.

gc.get_referrers (*objs) ¶get_referrers(*objs)

Trả về danh sách các đối tượng trực tiếp đề cập đến bất kỳ OBJ nào. Chức năng này sẽ chỉ định vị các container hỗ trợ thu gom rác; Các loại mở rộng đề cập đến các đối tượng khác nhưng không hỗ trợ thu gom rác sẽ không được tìm thấy.

Lưu ý rằng các đối tượng đã bị bỏ rơi, nhưng sống theo chu kỳ và chưa được thu thập bởi người thu gom rác có thể được liệt kê trong số các người giới thiệu kết quả. Để chỉ nhận được các đối tượng hiện tại, hãy gọi gc.disable()4 trước khi gọi gc.disable()5.

Cảnh báo

Phải cẩn thận khi sử dụng các đối tượng được trả về bởi gc.disable()5 vì một số trong số chúng vẫn có thể được xây dựng và do đó ở trạng thái không hợp lệ. Tránh sử dụng gc.disable()5 cho bất kỳ mục đích nào khác ngoài việc gỡ lỗi.

Tăng một sự kiện kiểm toán gc.disable()8 với đối số gc.disable()9.auditing event gc.disable()8 with argument gc.disable()9.

gc.get_referents (*objs) ¶get_referents(*objs)

Trả về một danh sách các đối tượng trực tiếp được đề cập bởi bất kỳ đối số nào. Các giới thiệu được trả về là những đối tượng được truy cập bởi các phương thức đối số C cấp độ C (nếu có) và có thể không phải là tất cả các đối tượng thực sự có thể truy cập trực tiếp. Các phương pháp gc.set_debug(gc.DEBUG_LEAK)0 chỉ được hỗ trợ bởi các đối tượng hỗ trợ thu gom rác và chỉ được yêu cầu truy cập các đối tượng có thể tham gia vào một chu kỳ. Vì vậy, ví dụ, nếu một số nguyên có thể truy cập trực tiếp từ một đối số, đối tượng số nguyên đó có thể hoặc không thể xuất hiện trong danh sách kết quả.

Tăng một sự kiện kiểm toán gc.set_debug(gc.DEBUG_LEAK)2 với đối số gc.disable()9.auditing event gc.set_debug(gc.DEBUG_LEAK)2 with argument gc.disable()9.

gc.is_tracked (obj) ¶is_tracked(obj)

Trả về True Nếu đối tượng hiện đang được theo dõi bởi người thu gom rác, gc.set_debug(gc.DEBUG_LEAK)5 khác. Theo nguyên tắc chung, các trường hợp của các loại nguyên tử đã được theo dõi và các trường hợp của các loại không nguyên tử (container, đối tượng do người dùng xác định) là. Tuy nhiên, một số tối ưu hóa cụ thể loại có thể có mặt để triệt tiêu dấu chân người thu gom rác của các trường hợp đơn giản (ví dụ: các dict chỉ chứa các khóa và giá trị nguyên tử):

>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked({})
False
>>> gc.is_tracked({"a": 1})
False
>>> gc.is_tracked({"a": []})
True

Mới trong phiên bản 3.1.

gc.is_finalized (obj) ¶is_finalized(obj)

Trả về True Nếu đối tượng đã cho đã được hoàn thành bởi người thu gom rác, gc.set_debug(gc.DEBUG_LEAK)5 khác.

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True

Mới trong phiên bản 3.9.

gc.freeze ()freeze()

Đóng băng tất cả các đối tượng được theo dõi bởi GC - chuyển chúng đến một thế hệ vĩnh viễn và bỏ qua tất cả các bộ sưu tập trong tương lai. Điều này có thể được sử dụng trước cuộc gọi POSIX Fork () để làm cho GC Sao chép thân thiện với Copy hoặc để tăng tốc bộ sưu tập. Ngoài ra, thu thập trước một cuộc gọi Posix Fork () có thể các trang miễn phí để phân bổ trong tương lai có thể gây ra sao chép trên đồng hồ để nó khuyên bạn nên vô hiệu hóa GC trong quy trình cha mẹ và đóng băng trước ngã ba và kích hoạt GC trong quy trình trẻ em.

Mới trong phiên bản 3.7.

gc.unfreeze () ¶unfreeze()

Giải phóng các đối tượng trong thế hệ vĩnh viễn, đưa chúng trở lại thế hệ lâu đời nhất.

Mới trong phiên bản 3.7.

gc.unfreeze () ¶get_freeze_count()

Giải phóng các đối tượng trong thế hệ vĩnh viễn, đưa chúng trở lại thế hệ lâu đời nhất.

Mới trong phiên bản 3.7.

gc.unfreeze () ¶

Giải phóng các đối tượng trong thế hệ vĩnh viễn, đưa chúng trở lại thế hệ lâu đời nhất.garbage

gc.get_freeze_count () ¶

Trả về số lượng đối tượng trong thế hệ vĩnh viễn.

Các biến sau đây được cung cấp cho quyền truy cập chỉ đọc (bạn có thể biến đổi các giá trị nhưng không nên làm lại chúng):Following PEP 442, objects with a gc.DEBUG_SAVEALL1 method don’t end up in gc.DEBUG_SAVEALL2 anymore.

gc.garbage¶callbacks

Một danh sách các đối tượng mà người thu thập được tìm thấy là không thể truy cập được nhưng không thể được giải phóng (các đối tượng không thể kiểm soát). Bắt đầu với Python 3.4, danh sách này sẽ trống hầu hết thời gian, ngoại trừ khi sử dụng các phiên bản của các loại tiện ích mở rộng C với khe cắm không phải -____ 38 gc.set_debug(gc.DEBUG_LEAK)9.

Nếu gc.DEBUG_SAVEALL0 được đặt, thì tất cả các đối tượng không thể truy cập sẽ được thêm vào danh sách này thay vì được giải phóng.

Đã thay đổi trong phiên bản 3.4: Theo PEP 442, các đối tượng có phương thức gc.DEBUG_SAVEALL1 don don kết thúc trong gc.DEBUG_SAVEALL2 nữa.

GC.Callbacks¶

Một danh sách các cuộc gọi lại sẽ được gọi bởi người thu gom rác trước và sau khi thu thập. Các cuộc gọi lại sẽ được gọi với hai đối số, pha và thông tin.

Pha có thể là một trong hai giá trị:

Bắt đầu: Bộ sưu tập rác sắp bắt đầu.

STOP STOP: Bộ sưu tập rác đã hoàn thành.

Thông tin là một dict cung cấp thêm thông tin cho cuộc gọi lại. Các khóa sau hiện đang được xác định:

Thế hệ của người Viking: Thế hệ lâu đời nhất được thu thập.

Đã thu thập được: khi giai đoạn là Stop Stop, số lượng đối tượng được thu thập thành công.

Không thể hiểu được: khi giai đoạn là Stop Stop, số lượng đối tượng không thể thu thập được và được đưa vào

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
5.

Các ứng dụng có thể thêm các cuộc gọi lại của riêng họ vào danh sách này. Các trường hợp sử dụng chính là:

Thu thập số liệu thống kê về bộ sưu tập rác, chẳng hạn như tần suất thu thập các thế hệ khác nhau và thời gian thu thập mất bao lâu.DEBUG_STATS

Cho phép các ứng dụng xác định và xóa các loại không thể kiểm soát của riêng họ khi chúng xuất hiện trong

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
5.

Mới trong phiên bản 3.3.DEBUG_COLLECTABLE

Các hằng số sau được cung cấp để sử dụng với gc.DEBUG_SAVEALL5:

gc.debug_stats¶DEBUG_UNCOLLECTABLE

Thống kê in trong quá trình thu thập. Thông tin này có thể hữu ích khi điều chỉnh tần số thu thập.

gc.debug_collectable¶Also print the contents of the

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
5 list at interpreter shutdown, if it isn’t empty.

In thông tin về các đối tượng có thể thu thập được.DEBUG_SAVEALL

gc.debug_uncollectable¶

In thông tin của các đối tượng không thể thu được được tìm thấy (các đối tượng không thể truy cập được nhưng không thể được giải phóng bởi người thu thập). Những đối tượng này sẽ được thêm vào danh sách
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
5.
DEBUG_LEAK

Đã thay đổi trong phiên bản 3.2: Cũng in nội dung của danh sách

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
5 khi tắt máy, nếu nó không trống.

Tải thêm tài liệu liên quan đến bài viết Hướng dẫn gc.disable python - gc.disable python