Advertisement
Guest User

Untitled

a guest
May 4th, 2015
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.71 KB | None | 0 0
  1. если в крации про object.__del__(self)
  2.  
  3. del x не является прямым вызовом x.__del__() - первая форма сокращает количество ссылок на объект x на одну, тогда как последний метод вызывается только когда количество ссылок достигает нуля. В некоторых часто встречающихся случаях могут возникнуть ситуации, мешающие обнулению счётчика, как то:
  4. взаимные ссылки между объектами (в списках или в деревьях)
  5. ссылки на объекты в стеке функции, где было вызвано исключение, так как в таком случае ссылки на объекты этого стека сохранены в sys.exc_traceback
  6. ссылки на объекты в стеке, если было вызвано не перехваченное исключение в интерактивном режиме (так как в таком случае ссылки на объекты сохранены в sys.last_traceback)
  7. Валерия Болотова: все на оф написано только на ангийском
  8.  
  9. [12:56:27] Валерия Болотова: В первом случае необходимо явно разрушить циклические ссылки; во втором и третьем - сохранить None в sys.exc_traceback или sys.last_traceback. Циклические ссылки определяются сборщиком мусора, если активирована соответствующая опция (как оно и есть по умолчанию), однако, если вызывается метод del() в коде, такие ссылки не будут обработаны автоматически.
  10. [13:05:00] Валерия Болотова: Пример Кирилла
  11.  
  12. class Topic(object):
  13. def __init__(self, comments):
  14. """
  15.  
  16. :param list of Comment comments: list
  17. """
  18. self.my_connetns = comments
  19. for c in comments:
  20. c.my_topic = self
  21.  
  22.  
  23. class Comment(object):
  24. def __init__(self, text):
  25. self.my_topic = None
  26. self.text = text
  27.  
  28.  
  29. t = Topic([Comment('1'), Comment('4')])
  30. print(call)
  31. [13:05:10] Валерия Болотова: сделай точку остановы на принте
  32. [13:05:19] Валерия Болотова: и посмотри в деюагере на объект t
  33. [13:05:30] Валерия Болотова: ты будешь его разворачивать бесконечно
  34. [13:06:10] Валерия Болотова: это конечно не критично, если перезапск приложения есть. Но при сборке мусора не то что нудевого, но и 2 поколения собрано не будет
  35. [13:07:54] Валерия Болотова: gc - в питоне запускает сборку поколениями типа Gen(o) - разбираем пустые - она быстрая. Есть параметр threashold - там можно установить через сколько циклов 0 сборки запускать 1 и тд. По умолчанию это 1000 сборок. Если приложение написано хорошо, то собирать на 1 поколении нечего. На это не уходит время - память освобождается вовремя
  36. [13:08:18] Валерия Болотова: ща скину пример, когда сборщик при переопределении метода del не собирает мусор вообще
  37.  
  38. [13:09:51] Валерия Болотова: class TopicWithDel:
  39. def __init__(self):
  40. #наш цикл в упрощении (Без комментов - но это тоже самое)
  41. self.comment = self
  42.  
  43. def __del__(self):
  44. pass
  45.  
  46. while True:
  47. TopicWithDel()
  48. [13:10:24] Валерия Болотова: Утечки происходят потому, что Python не знает, используется циклическая ссылка (в нашем случае это self.comment) в методе del. То есть, сборщик мусора не знает в каком месте надо начинать рвать цикл: или (i) сперва удалить ссылку self.comment→self, или (ii) сперва удалить ссылку self→self.comment
  49. [13:10:36] Валерия Болотова: вот о каких циклах идет речь
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement