python?教程之blinker?信號(hào)庫
一、安裝
- 一個(gè)基于
Python
的強(qiáng)大的信號(hào)庫,它既支持簡單的對(duì)象到對(duì)象通信,也支持針對(duì)多個(gè)對(duì)象進(jìn)行組播 - 支持注冊(cè)全局命名信號(hào),支持自定義命名信號(hào)
- 支持匿名信號(hào),線程安全
- 支持與接收者之間的持久連接與短暫連接
- 通過弱引用實(shí)現(xiàn)與接收者之間的自動(dòng)斷開連接
- 支持發(fā)送任意大小的數(shù)據(jù),支持收集信號(hào)接收者的返回值
pip install blinker
二、創(chuàng)建發(fā)送信號(hào)
- 信號(hào)通過
signal()
方法進(jìn)行創(chuàng)建 - 信號(hào)通過
send()
方法進(jìn)行發(fā)送
from blinker import signal # 創(chuàng)建一個(gè)信號(hào),并給信號(hào)命名 s = signal('autofelix') def say(args): print('我是飛兔小哥') # 信號(hào)注冊(cè)一個(gè)接收者 s.connect(say) if "__main__" == __name__: # 發(fā)送信號(hào) s.send()
三、匿名信號(hào)
blinker
也支持匿名信號(hào),就是不需要指定一個(gè)具體的信號(hào)值- 創(chuàng)建的每一個(gè)匿名信號(hào)都是互相獨(dú)立的
from blinker import signal # 創(chuàng)建一個(gè)匿名信號(hào) s = signal() def say(args): print('我是飛兔小哥') # 信號(hào)注冊(cè)一個(gè)接收者 s.connect(say) if "__main__" == __name__: # 發(fā)送信號(hào) s.send()
四、組播信號(hào)
- 組播信號(hào)是比較能體現(xiàn)出信號(hào)優(yōu)點(diǎn)的特征
- 多個(gè)接收者注冊(cè)到信號(hào)上,發(fā)送者只需要發(fā)送一次就能傳遞信息到多個(gè)接收者
from blinker import signal s = signal('autofelix') def fans_one(args): print(f'我是粉絲一號(hào),我關(guān)注了: {args}') def fans_two(args): print(f'我是粉絲二號(hào),我關(guān)注了: {args}') s.connect(fans_one) s.connect(fans_two) if "__main__" == __name__: s.send('飛兔小哥')
五、接受方訂閱主題
- 只有當(dāng)指定的主題發(fā)送消息時(shí)才發(fā)送給接收方
from blinker import signal s = signal('autofelix') def fans(args): print(f'我是個(gè)小粉絲,{args} 是我的老師') # 信號(hào)注冊(cè)一個(gè)接收者, 并指定主題 s.connect(animal, sender='飛兔') if "__main__" == __name__: for i in ['飛兔', '飛兔小姐姐', '飛兔小哥哥']: s.send(i)
六、裝飾器用法
- 除了可以函數(shù)注冊(cè)之外還有更簡單的信號(hào)注冊(cè)方法,那就是裝飾器
from blinker import signal s = signal('autofelix') @s.connect def fans_one(args): print(f'我是粉絲一號(hào),我關(guān)注了: {args}') @s.connect def fans_two(args): print(f'我是粉絲二號(hào),我關(guān)注了: {args}') if "__main__" == __name__: s.send('飛兔小哥')
七、訂閱主題的裝飾器
- connect 的注冊(cè)方法用著裝飾器時(shí)有一個(gè)弊端就是不能夠訂閱主題
- connect_via 方法支持訂閱主題
from blinker import signal s = signal('autofelix') @s.connect_via('飛兔') def fans(args): print(f'我是個(gè)小粉絲,{args} 是我的老師') if "__main__" == __name__: for i in ['飛兔', '飛兔小姐姐', '飛兔小哥哥']: s.send(i)
八、檢查信號(hào)是否有接收者
- 如果對(duì)于一個(gè)發(fā)送者發(fā)送消息前要準(zhǔn)備的耗時(shí)很長
- 為了避免沒有接收者導(dǎo)致浪費(fèi)性能的情況
- 可以先檢查某一個(gè)信號(hào)是否有接收者
- 在確定有接收者的情況下才發(fā)送
from blinker import signal a1 = signal('autofelix-1') a2 = signal('autofelix-2') def fans(sender): print('我是個(gè)小粉絲') a1.connect(fans) if "__main__" == __name__: res = a1.receivers print(res) if res: a1.send() res = a2.receivers print(res) if res: a2.send() else: print("我是個(gè)偶像")
九、是否訂閱了某個(gè)信號(hào)
- 檢查訂閱者是否由某一個(gè)信號(hào)
from blinker import signal a1 = signal('autofelix-1') a2 = signal('autofelix-2') def fans(sender): print('我是個(gè)小粉絲') a1.connect(fans) if "__main__" == __name__: res = a1.has_receivers_for(fans) print(res) res = a2.has_receivers_for(fans) print(res)
到此這篇關(guān)于python 教程之blinker 信號(hào)庫的文章就介紹到這了,更多相關(guān)python 信號(hào)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
輕松實(shí)現(xiàn)TensorFlow微信跳一跳的AI
這篇文章主要教大家如何輕松實(shí)現(xiàn)TensorFlow微信跳一跳的AI,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01在python中利用pycharm自定義代碼塊教程(三步搞定)
這篇文章主要介紹了在python中利用pycharm自定義代碼塊教程(三步搞定),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04python3之模塊psutil系統(tǒng)性能信息使用
psutil是個(gè)跨平臺(tái)庫,能夠輕松實(shí)現(xiàn)獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率,這篇文章主要介紹了python3之模塊psutil系統(tǒng)性能信息使用,感興趣的小伙伴們可以參考一下2018-05-05Python爬取門戶論壇評(píng)論淺談Python未來發(fā)展方向
這篇文章主要介紹了如何實(shí)現(xiàn)Python爬取門戶論壇評(píng)論,附含圖片示例代碼,講解了詳細(xì)的操作過程,有需要的的朋友可以借鑒參考下,希望可以有所幫助2021-09-09使用python實(shí)現(xiàn)拉鉤網(wǎng)上的FizzBuzzWhizz問題示例
這篇文章主要介紹了使用python實(shí)現(xiàn)拉鉤網(wǎng)上的FizzBuzzWhizz問題示例,需要的朋友可以參考下2014-05-05使用python將mysql數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為json數(shù)據(jù)的方法
這篇文章主要介紹了使用python將mysql數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為json數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python中導(dǎo)入自定義模塊的幾種方法總結(jié)
這篇文章主要介紹了Python中導(dǎo)入自定義模塊的幾種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01