Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pustaka isyarat kuat Python: blinker

Pustaka isyarat kuat Python: blinker

WBOY
WBOYke hadapan
2023-05-03 08:10:071384semak imbas

Python 强大的信号库:blinker

1. Isyarat

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.

Python 强大的信号库:blinker

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:

  • Menyokong pendaftaran isyarat bernama global
  • Menyokong isyarat tanpa nama
  • Menyokong tersuai. penamaan Isyarat
  • Menyokong sambungan berterusan dan jangka pendek dengan penerima
  • Secara automatik memutuskan sambungan daripada penerima melalui rujukan yang lemah
  • Menyokong penghantaran sebarang saiz Data
  • menyokong mengumpul nilai pulangan penerima isyarat
  • Keselamatan benang

2. Blinker menggunakan

kaedah pemasangan:

pip install blinker

2.1 Isyarat bernama

from blinker import signal
# 定义一个信号
s = signal('king')
def animal(args):
print('我是小钻风,大王回来了,我要去巡山')
# 信号注册一个接收者
s.connect(animal)
if "__main__" == __name__:
# 发送信号
s.send()

Python 强大的信号库:blinker

2.2 Isyarat Anonymous

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()

2.3 Isyarat berbilang hantaran

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('大王叫我来巡山,抓个和尚做晚餐!')

Python 强大的信号库:blinker

2.4 Penerima melanggan topik

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)

Python 强大的信号库:blinker

2.5 Penggunaan Penghias

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('大王叫我来巡山,抓个和尚做晚餐!')

2.6 Penghias yang boleh melanggan topik

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)

2.7 Semak sama ada isyarat mempunyai penerima

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)>}
我是小钻风,大王回来了,我要去巡山
{}
孩儿们都出去巡山了

2.8 Semak sama ada pelanggan melanggan isyarat tertentu

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

3 blinker

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.

Demo 3.1 Simple Flask

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.

Python 强大的信号库:blinker

3.2 Isyarat tersuai

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()

Python 强大的信号库:blinker

3.3 Isyarat Flask sendiri

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.

Python 强大的信号库:blinker

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.

4. Ringkasan kelebihan isyarat

:

  1. Aplikasi yang dipisahkan: menguraikan aplikasi berganding yang dijalankan secara bersiri ke dalam pelaksanaan berbilang peringkat
  2. Terbitkan Pelanggan: Kurangkan penggunaan pemanggil, maklumkan berbilang pelanggan dengan satu panggilan

Kelemahan isyarat:

  1. Tidak menyokong tak segerak
  2. Menyokong langganan Tema ini keupayaan adalah terhad

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!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam