neutron_lib: 一个进程内的发布与订阅

这种发布订阅模式是基于内存的,当遇到执行完一个操作后需要触发一些其他操作的时候:
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
posted @ 2020-11-27 10:42  961897  阅读(250)  评论(0编辑  收藏  举报