#python #django #multithreading #memory-leaks
#python #django #многопоточность #утечки памяти
Вопрос:
Я отлаживаю утечки памяти в приложении Django, и может ли что-то любопытное в django_cachepurge
:
from threading import currentThread
_urls_to_purge = {}
def add_purge_url(url):
# ....
_urls_to_purge.setdefault(currentThread(), set()).add(url)
Подвержена ли такая конструкция утечкам памяти?
Я подозреваю, что да, если я не знаком с некоторой магией Python здесь.
Нет места, где dict очищается.
Комментарии:
1. Почему вы не используете
threading.local().urls_to_purge
?
Ответ №1:
Я не знаю, что currentThread
возвращает, но вы, вероятно, можете использовать встроенные id
hash
функции or для получения безопасного значения.
Если поиска недостаточно, например, потому что вы хотите выполнить итерацию по контейнеру, есть weakref.WeakKeyDictionary
.
Комментарии:
1. Я добавил импорт
currentThread()
, поэтому вы принимаете это во внимание2. В этом случае ваш ответ — да. Ссылка предотвращает сбор нескольких байтов экземпляра потока. Я сомневаюсь, что что-то серьезное остается зависшим, поскольку потоки CPython все равно не сопоставляются с машинными потоками.