Rumah > Artikel > pembangunan bahagian belakang > Pustaka isyarat kuat Python: blinker
Helo semua, saya sepupu saya~
Isyarat ialah cara pemberitahuan atau komunikasi pihak dan penerima. Pengirim menghantar isyarat, dan proses penerima yang menerima isyarat akan melompat ke dalam fungsi pemprosesan isyarat Selepas pelaksanaan, ia akan melompat kembali ke kedudukan asal untuk meneruskan pelaksanaan.
Isyarat biasa dalam Linux, input Ctrl+C melalui papan kekunci, adalah untuk menghantar isyarat kepada sistem untuk memberitahu sistem untuk keluar dari proses semasa.
Ciri isyarat ialah pengirim memberitahu pelanggan tentang apa yang berlaku. Menggunakan isyarat terbahagi kepada 3 langkah: mentakrifkan isyarat, memantau isyarat dan menghantar isyarat.
Modul komunikasi yang menyediakan konsep isyarat dalam Python adalah berkelip.
Blinker ialah pustaka isyarat berkuasa berdasarkan Python, yang menyokong komunikasi titik-ke-titik yang mudah dan multicast titik-ke-berbilang. Mekanisme isyarat flask adalah berdasarkannya. Walaupun kernel Blinker kecil, ia sangat berkuasa Ia menyokong ciri berikut:
kaedah pemasangan:
pip install blinker
from blinker import signal # 定义一个信号 s = signal('king') def animal(args): print('我是小钻风,大王回来了,我要去巡山') # 信号注册一个接收者 s.connect(animal) if "__main__" == __name__: # 发送信号 s.send()
blinker juga menyokong isyarat tanpa nama, iaitu, tidak perlu menentukan nilai isyarat tertentu. Setiap isyarat tanpa nama yang dibuat adalah bebas antara satu sama lain.
from blinker import Signal s = Signal() def animal(sender): print('我是小钻风,大王回来了,我要去巡山') s.connect(animal) if "__main__" == __name__: s.send()
Isyarat berbilang hantaran ialah ciri yang boleh mencerminkan dengan lebih baik kelebihan isyarat. Berbilang penerima didaftarkan kepada isyarat, dan penghantar hanya perlu menghantar sekali untuk menyampaikan maklumat kepada berbilang penerima.
from blinker import signal s = signal('king') def animal_one(args): print(f'我是小钻风,今天的口号是: {args}') def animal_two(args): print(f'我是大钻风,今天的口号是: {args}') s.connect(animal_one) s.connect(animal_two) if "__main__" == __name__: s.send('大王叫我来巡山,抓个和尚做晚餐!')
Penerima menyokong melanggan topik yang ditentukan, dan hanya apabila topik yang ditentukan menghantar mesej, ia akan dihantar kepada penerima. Kaedah ini membezakan topik yang berbeza dengan baik.
from blinker import signal s = signal('king') def animal(args): print(f'我是小钻风,{args} 是我大哥') s.connect(animal, sender='大象') if "__main__" == __name__: for i in ['狮子', '大象', '大鹏']: s.send(i)
Selain pendaftaran fungsi, terdapat kaedah pendaftaran isyarat yang lebih mudah, iaitu penghias.
from blinker import signal s = signal('king') @s.connect def animal_one(args): print(f'我是小钻风,今天的口号是: {args}') @s.connect def animal_two(args): print(f'我是大钻风,今天的口号是: {args}') if "__main__" == __name__: s.send('大王叫我来巡山,抓个和尚做晚餐!')
Kaedah pendaftaran Connect mempunyai kelemahan apabila menggunakan penghias, iaitu ia tidak boleh melanggan topik, jadi terdapat kaedah connect_via yang lebih maju yang menyokong melanggan kepada topik.
from blinker import signal s = signal('king') @s.connect_via('大象') def animal(args): print(f'我是小钻风,{args} 是我大哥') if "__main__" == __name__: for i in ['狮子', '大象', '大鹏']: s.send(i)
Jika mengambil masa yang lama untuk menyediakan pengirim menghantar mesej, untuk mengelakkan pembaziran prestasi kerana tiada penerima, anda boleh Pertama Periksa sama ada terdapat penerima untuk isyarat tertentu, dan hanya hantar apabila ia disahkan bahawa terdapat penerima, supaya tepat.
from blinker import signal s = signal('king') q = signal('queue') def animal(sender): print('我是小钻风,大王回来了,我要去巡山') s.connect(animal) if "__main__" == __name__: res = s.receivers print(res) if res: s.send() res = q.receivers print(res) if res: q.send() else: print("孩儿们都出去巡山了")
{4511880240: <weakref at 0x10d02ae80; to 'function' at 0x10cedd430 (animal)>} 我是小钻风,大王回来了,我要去巡山 {} 孩儿们都出去巡山了
Anda juga boleh menyemak sama ada pelanggan melanggan isyarat tertentu
from blinker import signal s = signal('king') q = signal('queue') def animal(sender): print('我是小钻风,大王回来了,我要去巡山') s.connect(animal) if "__main__" == __name__: res = s.has_receivers_for(animal) print(res) res = q.has_receivers_for(animal) print(res)
True False
Flask menyepadukan blinker sebagai penyelesaian untuk aplikasi decoupled. Dalam Flask, senario penggunaan isyarat adalah seperti berikut: sebelum permintaan tiba dan selepas permintaan tamat. Pada masa yang sama, Flask juga menyokong isyarat tersuai.
from flask import Flask app = Flask(__name__) @app.route('/',methods=['GET','POST'],endpoint='index') def index(): return 'hello blinker' if __name__ == '__main__': app.run()
Apabila mengakses 127.0.0.1:5000, kembalikan kejap hello kepada penyemak imbas.
Oleh kerana Flask menyepadukan isyarat, ia diimport daripada Flask apabila menggunakan isyarat dalam Flask.
from flask import Flask from flask.signals import _signals app = Flask(__name__) s = _signals.singal('msg') def QQ(args): print('you have msg from QQ') s.connect(QQ) @app.route('/',methods=['GET','POST'],endpoint='index') def index(): s.send() return 'hello blinker' if __name__ == '__main__': app.run()
Selain memperibadikan isyarat, anda juga boleh menggunakan isyarat terbina dalam dalam Flask. Terdapat banyak jenis isyarat yang disertakan dengan Flask, seperti berikut:
请求 request_started = _signals.signal('request-started')# 请求到来前执行 request_finished = _signals.signal('request-finished')# 请求结束后执行 模板渲染 before_render_template = _signals.signal('before-render-template')# 模板渲染前执行 template_rendered = _signals.signal('template-rendered')# 模板渲染后执行 请求执行 got_request_exception = _signals.signal('got-request-exception')# 请求执行出现异常时执行 request_tearing_down = _signals.signal('request-tearing-down')# 请求执行完毕后自动执行(无论成功与否) appcontext_tearing_down = _signals.signal('appcontext-tearing-down') # 请求上下文执行完毕后自动执行(无论成功与否) 请求上下文中 appcontext_pushed = _signals.signal('appcontext-pushed')# 请求上下文push时执行 appcontext_popped = _signals.signal('appcontext-popped')# 请求上下文pop时执行 message_flashed = _signals.signal('message-flashed')# 调用flask在其中添加数据时,自动触发
Berikut ialah contoh cara menggunakan isyarat dalam Flask sebelum permintaan tiba
from flask import Flask from flask.signals import _signals, request_started import time app = Flask(__name__) def wechat(args): print('you have msg from wechat') # 从flask中引入已经定好的信号,注册一个函数 request_started.connect(wechat) @app.route('/',methods=['GET','POST'],endpoint='index') def index(): return 'hello blinker' if __name__ == '__main__': app.run()
Apabila permintaan datang, Flask akan melalui request_started Memberitahu penerima ialah fungsi wechat Pada masa ini, fungsi wechat dilaksanakan dahulu dan kemudian mengembalikan hasilnya kepada penyemak imbas.
Tetapi kaedah penggunaan ini tidak begitu sahih, kerana isyarat tidak menyokong kaedah tak segerak, jadi biasanya penerima isyarat dalam persekitaran pengeluaran adalah rangka kerja yang dikonfigurasikan untuk pelaksanaan tak segerak, seperti saderi rangka kerja tak segerak yang terkenal dalam Python.
:
Kelemahan isyarat:
Setiap suka, tontonan, komen dan tweet semula anda adalah sangat penting bagi saya, terima kasih atas sokongan anda.
Baiklah, jumpa lagi lain kali Saya suka kucing, teknologi, dan sepupu lama Sisi lebih lagi⁽⁽ଘ( ˙꒳˙ )ଓ⁾⁾
Atas ialah kandungan terperinci Pustaka isyarat kuat Python: blinker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!