成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python blinker庫學(xué)習(xí)

legendmohe / 1193人閱讀

摘要:的信號(hào)機(jī)制就是基于它建立的。觸發(fā)信號(hào)使用方法通知信號(hào)訂閱者。每個(gè)元組的組成為。與是兩個(gè)不同的信號(hào)。這時(shí),可以使用優(yōu)化信號(hào)發(fā)送信號(hào)通常會(huì)進(jìn)行優(yōu)化,以便快速的發(fā)送。

參考 Blinker Documentation

Blinker 是一個(gè)基于Python的強(qiáng)大的信號(hào)庫,它既支持簡(jiǎn)單的對(duì)象到對(duì)象通信,也支持針對(duì)多個(gè)對(duì)象進(jìn)行組播。Flask的信號(hào)機(jī)制就是基于它建立的。

Blinker的內(nèi)核雖然小巧,但是功能卻非常強(qiáng)大,它支持以下特性:

支持注冊(cè)全局命名信號(hào)

支持匿名信號(hào)

支持自定義命名信號(hào)

支持與接收者之間的持久連接與短暫連接

通過弱引用實(shí)現(xiàn)與接收者之間的自動(dòng)斷開連接

支持發(fā)送任意大小的數(shù)據(jù)

支持收集信號(hào)接收者的返回值

線程安全

創(chuàng)建信號(hào)

信號(hào)通過signal()方法進(jìn)行創(chuàng)建:

>>> from blinker import signal
>>> initialized = signal("initialized")
>>> initialized is signal("initialized")
True

每次調(diào)用signal("name")都會(huì)返回同一個(gè)信號(hào)對(duì)象。因此這里signal()方法使用了單例模式。

訂閱信號(hào)

使用Signal.connect()方法注冊(cè)一個(gè)函數(shù),每當(dāng)觸發(fā)信號(hào)的時(shí)候,就會(huì)調(diào)用該函數(shù)。該函數(shù)以觸發(fā)信號(hào)的對(duì)象作為參數(shù),這個(gè)函數(shù)其實(shí)就是信號(hào)訂閱者。

>>> def subscriber(sender):
...     print("Got a signal sent by %r" % sender)
...
>>> ready = signal("ready")
>>> ready.connect(subscriber)
觸發(fā)信號(hào)

使用Signal.send()方法通知信號(hào)訂閱者。

下面定義類Processor,在它的go()方法中觸發(fā)前面聲明的ready信號(hào),send()方法以self為參數(shù),也就是說Processor的實(shí)例是信號(hào)的發(fā)送者。

>>> class Processor:
...    def __init__(self, name):
...        self.name = name
...
...    def go(self):
...        ready = signal("ready")
...        ready.send(self)
...        print("Processing.")
...        complete = signal("complete")
...        complete.send(self)
...
...    def __repr__(self):
...        return "" % self.name
...
>>> processor_a = Processor("a")
>>> processor_a.go()
Got a signal sent by 
Processing.

注意到go()方法中的complete信號(hào)沒?并沒有訂閱者訂閱該信號(hào),但是依然可以觸發(fā)該信號(hào)。如果沒有任何訂閱者的信號(hào),結(jié)果是什么信號(hào)也不會(huì)發(fā)送,而且Blinker內(nèi)部對(duì)這種情況進(jìn)行了優(yōu)化,以盡可能的減少內(nèi)存開銷。

訂閱特定的發(fā)布者

默認(rèn)情況下,任意發(fā)布者觸發(fā)信號(hào),都會(huì)通知訂閱者。可以給Signal.connect()傳遞一個(gè)可選的參數(shù),以便限制訂閱者只能訂閱特定發(fā)送者。

>>> def b_subscriber(sender):
...     print("Caught signal from processor_b.")
...     assert sender.name == "b"
...
>>> processor_b = Processor("b")
>>> ready.connect(b_subscriber, sender=processor_b)

現(xiàn)在訂閱者只訂閱了processor_b發(fā)布的ready信號(hào):

>>> processor_a.go()
Got a signal sent by 
Processing.
>>> processor_b.go()
Got a signal sent by 
Caught signal from processor_b.
Processing.
通過信號(hào)收發(fā)數(shù)據(jù)

可以給send()方法傳遞額外的關(guān)鍵字參數(shù),這些參數(shù)會(huì)傳遞給訂閱者。

>>> send_data = signal("send-data")
>>> @send_data.connect
... def receive_data(sender, **kw):
...     print("Caught signal from %r, data %r" % (sender, kw))
...     return "received!"
...
>>> result = send_data.send("anonymous", abc=123)
Caught signal from "anonymous", data {"abc": 123}

send()方法的返回值收集每個(gè)訂閱者的返回值,拼接成一個(gè)元組組成的列表。每個(gè)元組的組成為(receiver function, return value)。

匿名信號(hào)

前面我們創(chuàng)建的信號(hào)都是命名信號(hào),每次調(diào)用Signal構(gòu)造器都會(huì)創(chuàng)建一個(gè)唯一的信號(hào),,也就是說每次創(chuàng)建的信號(hào)是不一樣的。下面對(duì)前面的Processor類進(jìn)行改造,將signal作為它的類屬性。

>>> from blinker import Signal
>>> class AltProcessor:
...    on_ready = Signal()
...    on_complete = Signal()
...
...    def __init__(self, name):
...        self.name = name
...
...    def go(self):
...        self.on_ready.send(self)
...        print("Alternate processing.")
...        self.on_complete.send(self)
...
...    def __repr__(self):
...        return "" % self.name
...

上面創(chuàng)建的就是匿名信號(hào)。on_ready與on_complete是兩個(gè)不同的信號(hào)。

使用修飾器訂閱信號(hào)

除了使用connect()方法訂閱信號(hào)之外,使用@connect修飾器可以達(dá)到同樣的效果。

>>> apc = AltProcessor("c")
>>> @apc.on_complete.connect
... def completed(sender):
...     print "AltProcessor %s completed!" % sender.name
...
>>> apc.go()
Alternate processing.
AltProcessor c completed!

盡管這樣用起來很方便,但是這種形式不支持訂閱指定的發(fā)送者。這時(shí),可以使用connect_via()

>>> dice_roll = signal("dice_roll")
>>> @dice_roll.connect_via(1)
... @dice_roll.connect_via(3)
... @dice_roll.connect_via(5)
... def odd_subscriber(sender):
...     print("Observed dice roll %r." % sender)
...
>>> result = dice_roll.send(3)
Observed dice roll 3.
優(yōu)化信號(hào)發(fā)送

信號(hào)通常會(huì)進(jìn)行優(yōu)化,以便快速的發(fā)送。不管有沒有訂閱者,都可以發(fā)送信號(hào)。如果發(fā)送信號(hào)時(shí)需要傳送的參數(shù)要計(jì)算很長(zhǎng)時(shí)間,可以在發(fā)送之前使用receivers屬性先檢查一下是否有訂閱者。

>>> bool(signal("ready").receivers)
True
>>> bool(signal("complete").receivers)
False
>>> bool(AltProcessor.on_complete.receivers)
True

還可以檢查訂閱者是否訂閱了某個(gè)具體的信號(hào)發(fā)布者。

>>> signal("ready").has_receivers_for(processor_a)
True

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38026.html

相關(guān)文章

  • ESP8266+Blinker 的萬物互聯(lián)(智能家居篇)

    摘要:下面是演示視頻物聯(lián)網(wǎng)文章目錄前言一準(zhǔn)備二操作步驟配置配置三效果展示總結(jié)前言實(shí)現(xiàn)萬物互聯(lián)第一步,千里點(diǎn)燈,然后添加你想要的模塊就可以了,接下來我們進(jìn)入正文。 前面學(xué)習(xí)...

    CntChen 評(píng)論0 收藏0
  • ESP8266-NodeMCU項(xiàng)目(三):ESP8266-NodeMCU+Blinker+紅外模塊(

    摘要:紅外模塊接入板子后,可進(jìn)行以上操作,并接入,通過控制空調(diào)。材料清單板子紅外接收模塊紅外發(fā)射模塊線杜邦線左邊是紅外發(fā)射模塊,右邊是紅外接收模塊。 錯(cuò)開の折騰經(jīng)歷:ES...

    luoyibu 評(píng)論0 收藏0
  • ESP8266-NodeMCU項(xiàng)目(四):將上一項(xiàng)目的空調(diào)控制接入小愛同學(xué)(Blinker_APP同

    摘要:錯(cuò)開折騰經(jīng)歷文章目錄前言思路設(shè)備配置程序代碼小愛訓(xùn)練測(cè)試總結(jié)前言之前已經(jīng)進(jìn)行了項(xiàng)目二接入小愛同學(xué)以及項(xiàng)目三空調(diào)控制,接下來便是將二者合一,實(shí)現(xiàn)控制,溫濕度查看,以及小愛同學(xué)進(jìn)行簡(jiǎn)單空調(diào)控制。 ...

    Loong_T 評(píng)論0 收藏0
  • Flask Web Development —— 大型應(yīng)用程序結(jié)構(gòu)(下)

    摘要:?jiǎn)卧獪y(cè)試這個(gè)應(yīng)用非常小以至于不需要太多的測(cè)試,但是作為示例會(huì)在示例中展示兩個(gè)簡(jiǎn)單的測(cè)試定義。示例單元測(cè)試編寫好的測(cè)試使用的是來自于標(biāo)準(zhǔn)庫中標(biāo)準(zhǔn)的包。為了運(yùn)行單元測(cè)試,可以在腳本中增加一個(gè)自定義的命令。 4、啟動(dòng)腳本 頂層目錄中的manage.py文件用于啟動(dòng)應(yīng)用。這個(gè)腳本會(huì)在示例7-8中展示。 示例7-8. manage.py:?jiǎn)?dòng)腳本 #!/usr/bin/env python im...

    whidy 評(píng)論0 收藏0
  • BLIINKER+ESP32編譯問題:some warnings being treated as

    摘要:?jiǎn)栴}描述我在學(xué)習(xí)的時(shí)候想嘗試一下物聯(lián)網(wǎng)的使用,在調(diào)用官方的例程的時(shí)候發(fā)現(xiàn)程序編譯出現(xiàn)了問題上圖中的對(duì)應(yīng)多個(gè)庫沒有問題,對(duì)實(shí)際編譯無影響。主要是出現(xiàn)了這個(gè)問題上圖中是的編譯器,出現(xiàn)問題是因?yàn)榫幾g器把一些警告當(dāng)成錯(cuò)誤了。再次編譯,編譯成功 問題描述: ? ? ? ? 我在學(xué)習(xí)esp32的時(shí)候想嘗...

    codecook 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

legendmohe

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<