django signal 拾遺

首先看看Signal類的一些主要的接口。python

class Signal(object):
    def __init__(self, providing_args=None, use_caching=False):
        ......
        
    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
        ......

    def disconnect(self, receiver=None, sender=None, weak=True, dispatch_uid=None):
        ......
        
    def send(self, sender, **named):
        ......

Signal類,不是指一個具體的信號,而是表示一種類型的信號。緩存

這個信號,能夠有多個發送者,也能夠有多個接受者。數據結構

首先必須將接收者和發送者綁定,這裏connect方法實現了這一點。若是不指定sender,ui

這個接收者會接收全部此信號的發送者。spa

而後使用send方法,須要指定sender。表示由此sender發送的信號,code

對於某些指定sender的接受者,這是頗有必要的。接口

disconnect來斷開放送者和接收者的信號聯繫。ci


能夠看見信號的創建和發射都是由Signal類提供的。因此Signal類也承擔着管理髮送者和發送者的責任。it

Signal類存儲它們的數據結構,是經過類裏面的receiver屬性。經過__init__構造方法,能夠看到receiversio

是一個列表。receivers裏面的每一個元素,由key和receiver組成,表明着一個信號的鏈接。而key是由receiver和sender

生成的。結構如圖所示:( (r_key, s_key),  receiver  )。

每一個connect和disconnect都會更新receivers。

send也會根據receivers找到相應的接收者。


另外這個模塊值得注意的一點是,對receivers的查詢,它使用了緩存的技術,經過weakref即若引用的技術。

 self.sender_receivers_cache = weakref.WeakKeyDictionary()

sender_receiver_cache是一個弱引用的字典。key爲sender, value爲相應綁定的recierver列表。

sender_receiver_cache在每connect和disconnect裏,會被清空。

在send裏面會經過 _live_receivers(self, sender)方法,查找對應的receivers, 而後會將查找的結果記錄到緩存裏。

相關文章
相關標籤/搜索