zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Javascript 加解密
    Netsuite 友好提示
    一中另类调试javascrīpt的好方法
    js 转化为标准日期型
    多站点整合—单点登录简单方案{装载}
    win+e 失效
    (转载)向页面某处动态添加js的方法
    prototype.js源码解读(一)
    Saved search in customer center on tab
    spring boot 加载web容器tomcat流程源码分析
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/14046680.html
Copyright © 2011-2022 走看看