15

Django docs विषय पर यह कहना:Django के सिग्नल हैंडलिंग डिफ़ॉल्ट रूप से कॉलबैक के लिए कमजोर संदर्भों का उपयोग क्यों करता है?

भी ध्यान रखें कि Django स्टोर, डिफ़ॉल्ट रूप से कमजोर संदर्भ के रूप में संचालकों संकेत इसलिए यदि आपके हैंडलर एक स्थानीय समारोह है, यह कचरा एकत्र हो सकता है। इसे रोकने के लिए, कमजोर पास करें = पर झूठा जब आप सिग्नल के कनेक्ट() को कॉल करते हैं।

मुझे यह डिफ़ॉल्ट नहीं है कि यह डिफ़ॉल्ट क्यों है, और मुझे समझ में नहीं आ रहा है कि आप कभी भी एक सिग्नल क्यों चाहते हैं जिसे आप स्पष्ट रूप से गायब होने के लिए पंजीकृत कर चुके हैं। तो यहां कमजोर संदर्भों के लिए उपयोग-मामला क्या है? और यह डिफ़ॉल्ट क्यों है?

मुझे एहसास है कि शायद 99% मामलों में कोई फर्क नहीं पड़ता है, लेकिन स्पष्ट रूप से कुछ ऐसा है जो मुझे समझ में नहीं आता है, और मैं जानना चाहता हूं कि क्या कोई "गॉथचास" गुप्त है जो मुझे किसी दिन काट सकता है।

उत्तर

8

सिग्नल हैंडलर को कमजोर संदर्भ के रूप में संग्रहीत किया जाता है ताकि वे कचरा न होने से संदर्भित वस्तु से बच सकें (उदाहरण के लिए सिग्नल हैंडलर को स्पष्ट रूप से हटाने के बाद), क्योंकि सिग्नल अभी भी उड़ रहा है।

+0

लेकिन निश्चित रूप से यदि संकेत हैंडलर स्पष्ट रूप से डिस्कनेक्ट हो गई, संकेत हैंडलर कहीं भी संदर्भित नहीं किया जाएगा, और यह है कि में कुछ भी कचरा संग्रहण बंद नहीं होंगे मामला। ऐसा लगता है कि कमजोर संदर्भों का उपयोग करने से केवल तभी फर्क पड़ता है जब संकेत * स्पष्ट रूप से डिस्कनेक्ट नहीं होता है, और यदि आप इसके लिए नहीं पूछते हैं तो सिग्नल डिस्कनेक्ट क्यों करना चाहते हैं? –

+0

आप सही हैं, इसलिए सिग्नल हैंडलर को कचरा इकट्ठा करने के लिए, कमजोर संदर्भों के बिना आपको दो चीजें करना होगा: सिग्नल हैंडलर को हटाएं, और सिग्नल को डिस्कनेक्ट करें। यह सभी के लिए स्पष्ट नहीं हो सकता है, इसलिए मुझे लगता है कि यही कारण है कि डिफ़ॉल्ट रूप से कमजोर संदर्भों का उपयोग किया जाता है। –

+1

इतना घना होने के लिए खेद है, लेकिन मुझे अभी भी समझ में नहीं आता है। मुझे लगता है कि मैं समझता हूं कि सिग्नल को "डिस्कनेक्ट" करके आपका क्या मतलब है: हैंडलर में तर्क के रूप में गुजरने वाले 'सिग्नल' उदाहरण पर 'डिस्कनेक्ट' विधि को कॉल करें। लेकिन सिग्नल हैंडलर को "हटाएं" से आपका क्या मतलब है? –

4

बाउंड विधियां उस वस्तु का संदर्भ रखती हैं जो वे संबंधित हैं (अन्यथा, वे 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>] 
[] 

एक महत्वपूर्ण बात है जब कॉलबैक पर weakrefs रखने पता है कि तुम बाध्य तरीकों सीधे weakref नहीं कर सकते, क्योंकि वे हमेशा मक्खी पर बनाई गई हैं है:

>>> 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> 
+0

मैं Django कार्यान्वयन के माध्यम से skimming था और देखा कि बाध्य तरीकों के कमजोर संदर्भ प्रदान करने के लिए वास्तव में विशेष प्रयास है। लेकिन अनबाउंड तरीकों के बारे में कैसे? उनके संदर्भ कहां रखा जाता है?क्या उनके कचरा संग्रह ट्रिगर करेगा? जब आप मॉड्यूल को डेल करते हैं जहां उन्हें परिभाषित किया गया था? – hsribei