In [1]: from blinker import signal
In [2]: a = signal('signal_test')
In [3]: b = signal('signal_test')
In [4]: a is b
Out[4]: True
In [5]: def subscriber(sender):
...: print('Got a signal sent by {}'.format(sender))
...:
In [6]: ready = signal('ready')
In [7]: ready.connect(subscriber)
Out[7]: <function __main__.subscriber(sender)>
In [12]: class Processor(object):
...:
...: 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 '<Processor {}>'.format(self.name)
...:
In [13]: processor_a = Processor('a')
In [14]: processor_a.go()
Got a signal sent by <Processor a>
Processing...
In [18]: def b_subscriber():
...: print('Caught signal from peocessor_b')
...:
In [19]: ready.connect(b_subscriber, sender=processor_b)
Out[19]: <function __main__.b_subscriber(sender)>
In [20]: processor_a.go()
Got a signal sent by <Processor a>
Processing...
In [21]: processor_b.go()
Got a signal sent by <Processor b>
Caught signal from peocessor_b
Processing...
In [22]: send_data = signal('send-data')
In [23]: @send_data.connect
...: def receive_data(sender, **kw):
...: print('Caught signal from {}, data: {}'.format(sender, kw))
...: return 'received!'
...:
...:
In [24]: result = send_data.send('anonymous', abc=123)
Caught signal from anonymous, data: {'abc': 123}
In [25]: result
Out[25]: [(<function __main__.receive_data(sender, **kw)>, 'received!')]
In [28]: from blinker import Signal
In [29]: class AltProcessor(object):
...: on_ready = Signal()
...: on_complete = Signal()
...:
...: def __init__(self, name):
...: self.name = name
...:
...: def go(self):
...: self.on_ready.send(self)
...: print('Altername processing')
...: self.on_complete.send(self)
...:
...: def __repr__(self):
...: return '<AltProcessor {}>'.format(self.name)
In [31]: @dice_roll.connect_via(1)
...: @dice_roll.connect_via(3)
...: @dice_roll.connect_via(5)
...: def odd_subscriver(sender):
...: print('Observed dice roll {}'.format(sender))
...:
In [32]: result = dice_roll.send(3)
Observed dice roll 3
In [33]: result = dice_roll.send(1)
Observed dice roll 1
In [34]: result = dice_roll.send(5)
Observed dice roll 5
In [35]: result = dice_roll.send(2)
In [37]: bool(signal('ready').receivers)
Out[37]: True
In [38]: bool(signal('complete').receivers)
Out[38]: False
In [39]: bool(AltProcessor.on_complete.receivers)
Out[39]: False
In [40]: signal('ready').has_receivers_for(processor_a)
Out[40]: True
import typing as t
try:
from blinker import Namespace
signals_available = True
except ImportError:
signals_available = False
class Namespace: # type: ignore
def signal(self, name: str, doc: t.Optional[str] = None) -> "_FakeSignal":
return _FakeSignal(name, doc)
class _FakeSignal:
"""If blinker is unavailable, create a fake class with the same
interface that allows sending of signals but will fail with an
error on anything else. Instead of doing anything on send, it
will just ignore the arguments and do nothing instead.
"""
def __init__(self, name: str, doc: t.Optional[str] = None) -> None:
self.name = name
self.__doc__ = doc
def send(self, *args: t.Any, **kwargs: t.Any) -> t.Any:
pass
def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.Any:
raise RuntimeError(
"Signalling support is unavailable because the blinker"
" library is not installed."
)
connect = connect_via = connected_to = temporarily_connected_to = _fail
disconnect = _fail
has_receivers_for = receivers_for = _fail
del _fail
# The namespace for code signals. If you are not Flask code, do
# not put signals in here. Create your own namespace instead.
_signals = Namespace()
# Core signals. For usage examples grep the source code or consult
# the API documentation in docs/api.rst as well as docs/signals.rst
# 主流程
appcontext_pushed = _signals.signal("appcontext-pushed") #app 上下文 push 时执行
template_rendered = _signals.signal("template-rendered")
before_render_template = _signals.signal("before-render-template")
request_started = _signals.signal("request-started")
request_finished = _signals.signal("request-finished")
request_tearing_down = _signals.signal("request-tearing-down")
got_request_exception = _signals.signal("got-request-exception")
appcontext_tearing_down = _signals.signal("appcontext-tearing-down")
appcontext_popped = _signals.signal("appcontext-popped")
message_flashed = _signals.signal("message-flashed")
from xlib.util.blinker import signal
def subscriber(sender, action):
print("Got a signal sent by %r" % sender)
return action
ready = signal('ready')
ready.connect(subscriber)
result = ready.send('anonymous', action="ccc")
"""
Got a signal sent by 'anonymous'
"""
print result
"""
[(<function subscriber at 0x1071a1b90>, 'ccc')]
send() 方法的返回值收集每个订阅者的返回值,拼接成一个元组组成的列表。每个元组的组成为 (receiver function, return value)。
"""
print result[0][0].func_name
"""
subscriber
"""