لماذا تعالج إشارة Django استخدام مراجع ضعيفة لاسترداد الإعداد الافتراضي؟

StackOverflow https://stackoverflow.com/questions/1110668

سؤال

ال Django مستندات قل هذا في هذا الموضوع:

لاحظ أيضا أن Django يخزن معالجات الإشارة كمراجع ضعيفة افتراضيا، لذلك إذا كانت معالجتك وظيفة محلية، فقد يتم جمع القمامة. لمنع هذا، تمرير ضعيف = خطأ عند استدعاء اتصال الإشارة ().

لم أتمكن من العثور على أي مبرر لماذا هذا هو الافتراضي، وأنا لا أفهم لماذا تريد أن تكون للإشارة التي قمت بتسجيلها صراحة لتختفي ضمنيا. إذن ما هي حالة الاستخدام لمراجع ضعيفة هنا؟ ولماذا هو الافتراضي؟

أدرك أنه ربما لا يهم في كلتا الحالتين في 99٪ من الحالات، ولكن من الواضح أن هناك شيئا لا أفهمه هنا، وأريد أن أعرف ما إذا كان هناك أي "gotchas" قد يعضني يوما ما.

هل كانت مفيدة؟

المحلول

يتم تخزين معالجات الإشارات على أنها مراجع ضعيفة لتجنب الكائن الذي يشيرون إليه من عدم وجود القمامة التي تم جمعها (على سبيل المثال بعد حذف واضحة لمعالج الإشارة)، فقط لأن الإشارة لا تزال تحلق حولها.

نصائح أخرى

طرق ملزمة الاحتفاظ بالإشارة إلى الكائن الذي ينتمون إليه (خلاف ذلك، لا يمكنهم ملء self, ، راجع ال وثائق بيثون). النظر في التعليمات البرمجية التالية:

import gc
class SomeLargeObject(object):
    def on_foo(self): pass

slo = SomeLargeObject()
callbacks = [slo.on_foo]

print [o for o in gc.get_objects() if isinstance(o, SomeLargeObject)]
del slo
print [o for o in gc.get_objects() if isinstance(o, SomeLargeObject)]
callbacks = []
print [o for o in gc.get_objects() if isinstance(o, SomeLargeObject)]

الإخراج:

[<__main__.SomeLargeObject object at 0x15001d0>]
[<__main__.SomeLargeObject object at 0x15001d0>]
[]

هناك شيء مهم يجب معرفته عند إبقاء الضعيف في عمليات الاسترجاعات هو أنه لا يمكنك الضعف بطرق ملزمة مباشرة، لأنها تم إنشاؤها دائما على الطيران:

>>> class SomeLargeObject(object):
...  def on_foo(self): pass
>>> import weakref
>>> def report(o):
...  print "about to collect"
>>> slo = SomeLargeObject()
>>> #second argument: function that is called when weakref'ed object is finalized
>>> weakref.proxy(slo.on_foo, report)
about to collect
<weakproxy at 0x7f9abd3be208 to NoneType at 0x72ecc0>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top