除了 post_save 这些内置信号,你也可以定义自己的信号,让一个模块「宣布」某件事发生了,而不必知道谁在监听。这篇把自定义信号的定义、发送、sender 匹配、异步 receiver 与容错发送逐项跑一遍。
['email 订单 7 金额 99'] [('send_email', 'ok')]
Signal(providing_args=[...]) → TypeError: Signal.__init__() got an unexpected keyword argument 'providing_args'sender=Shop 类: ['for Shop'] sender='shop' 字符串: ["for 'shop'"] sender=Shop() 实例: []
发送时 sender 传什么,connect 时 sender= 就要传同样的东西。
send() 同步调用 → 0.41 s,返回 [('slow_sync', 's'), ('slow_async', 'a')]
asend() 协程里调用 → 0.41 s,返回 [('slow_sync', 's'), ('slow_async', 'a')]我原本以为 asend() 会明显更快,实测两者都是 0.41 s(总和约等于两个 receiver 各自的 0.2 s 相加)——所以本文不能说 asend 让 receiver 并行。同步 receiver 在 asend 里怎么被调度也没有进一步查证。
ok → 'fine'
bad → KeyError('missing') (是异常对象)