这种发布订阅模式是基于内存的,当遇到执行完一个操作后需要触发一些其他操作的时候:
1. 一种方法是直接以函数调用的方式,如果有多个需要触发的事情,就调用多个函数。
2. 一种方法是用neutron_lib发布一个EventPayload事件,需要触发的操作事先订阅这个事件;不需要执行某个操作时,只需要取消订阅即可;可用于解耦代码结构。
# encoding: utf-8
'''
neutron_lib示例
- 一个进程内的订阅与发布
- 允许订阅者有多个,会同时收到发布的消息,触发事件。
'''
from neutron_lib.callbacks import registry
from neutron_lib.callbacks.events import PRECOMMIT, EventPayload
def func(resource, event, trigger, payload):
print(resource, event, trigger, payload.request_body)
print(payload.metadata)
print('call func1')
print()
def func2(resource, event, trigger, payload):
print(resource, event, trigger, payload.request_body)
print(payload.metadata)
print('call func2')
# 订阅者
registry.subscribe(func, 'ashore', f'{PRECOMMIT}timeashore')
registry.subscribe(func2, 'ashore', f'{PRECOMMIT}timeashore')
# 发布
event_payload = EventPayload(context=None, request_body={'name': 'zhangsan', 'age': 20}, metadata={'x': 10, 'y': 20})
registry.publish('ashore', f'{PRECOMMIT}timeashore', None, event_payload)
ashore precommit_timeashore None {'name': 'zhangsan', 'age': 20}
{'x': 10, 'y': 20}
call func1
ashore precommit_timeashore None {'name': 'zhangsan', 'age': 20}
{'x': 10, 'y': 20}
call func2