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
    
  • 相关阅读:
    数据泵使用笔记与相关shell
    手动创建数据库
    归档日志小试
    SQL语句的结果如何反映在SGA与磁盘中
    oracle 表空间
    linux 循环判断、数组、循环
    oracle 连接方式
    Changing Project Binding to Surround SCM Integration Provider with Visual Studio 2010
    On Caching and Evangelizing SQL
    Windows下使用python3 + selenium实现网页自动填表功能
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/14046680.html
Copyright © 2011-2022 走看看