zoukankan      html  css  js  c++  java
  • python redis 实现简单的消息订阅

    python + redis 实现简单的消息订阅

    订阅端

    import redis
    from functools import wraps
    
    
    class Subscribe:
        def __init__(self, channel: str, **kwargs):
            self.coon = redis.StrictRedis(**kwargs)
            self.channel = channel
            self.registerd = list()
            self.course = self.coon.pubsub()
            self.course.subscribe(self.channel)
    
        def register(self, func):
            self.registerd.append(func)
    
            @wraps(func)
            def wrapper(*args, **kwargs):
                return func(*args, **kwargs)
    
            return wrapper
    
        def listen(self):
            messages = self.course.listen()
            for message in messages:
                self.dispatch(message)
    
        def dispatch(self, message):
            for handler in self.registerd:
                handler(message)
    
    
    DEFAULT_CHANNEL = 'channle'
    
    subscribe = Subscribe(DEFAULT_CHANNEL)
    
    
    @subscribe.register
    def print_args(message):
        print(message)
    
    
    subscribe.listen()
    
    
    • 先创建一个订阅对象,利用register装饰器来注册监听到的消息的处理函数
    • 最后执行listen方法来监听,当当前对象监听到了消息,会自动转交给所有的处理函数

    发布端

    import redis
    
    coon = redis.StrictRedis()
    
    coon.publish('channel', '发布的消息对象')
    
    •   发布端只要向同一个数据库的里执行使用相同的key执行`publish`命令即可
      
    • 可以利用pickle模块来对python对象进行序列化, 传入redis。如果是线程锁对象,可以使用dill模块序列化。
  • 相关阅读:
    TCP 协议如何解决粘包、半包问题 转载:https://mp.weixin.qq.com/s/XqGCaX94hCvrYI_Tvfq_yQ
    [国家集训队]happiness
    CF592D Super M
    [APIO2010]巡逻
    [NOI2012]美食节
    [JSOI2008]Blue Mary的旅行
    [十二省联考2019]D1T2字符串问题
    [十二省联考2019]D2T2春节十二响
    [十二省联考2019]D1T1异或粽子
    [WC2008]游览计划
  • 原文地址:https://www.cnblogs.com/ivy-blogs/p/12505671.html
Copyright © 2011-2022 走看看