3 Star 4 Fork 1

BingoLee/FileSync

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
fs_message.py 2.03 KB
一键复制 编辑 原始数据 按行查看 历史
BingoLee 提交于 2021-08-31 23:42 +08:00 . add FileSync
# -*- coding: UTF-8 -*-
"""
消息驱动模块
使用发布/订阅模式实现消息回调
本模块负责:
1. 各模块之间解耦,通过消息驱动
2. 实现一对一和一对多的消息模式
"""
from collections import defaultdict
class _Intermedia:
""" 一对多模式 """
# 本软件(filesync)中刚好是按照:
# ConfigData
# Inotify
# Master
# Monitor
# 这种顺序先后调用,否则不能使用defaultdict
# 因为reload动作中,Master依赖ConfigData先完成
messages = defaultdict(dict)
@classmethod
def broadcast(cls, msg, param):
for name, callback in cls.messages[msg].items():
callback(param)
@classmethod
def register(cls, msg, handler):
cls.messages[msg][handler.name] = handler.callback
@classmethod
def unregister(cls, msg, handler):
try:
del cls.messages[msg][handler.name]
except:
pass
class Subscriber(object):
def __init__(self, name):
self.name = name
self.callback = None
def register(self, msg, callback):
self.callback = callback
_Intermedia.register(msg, self)
def unregister(self, msg):
_Intermedia.unregister(msg, self)
class Publisher:
@classmethod
def notify(cls, msg, param=None):
_Intermedia.broadcast(msg, param)
class _Medium:
""" 一对一模式 """
messages = {}
@classmethod
def unicast(cls, msg, param):
callback = cls.messages[msg]
return callback(param)
@classmethod
def bind(cls, msg, callback):
cls.messages[msg] = callback
@classmethod
def unbind(cls, msg):
try:
del cls.messages[msg]
except:
pass
class Receiver:
@classmethod
def bind(cls, msg, callback):
_Medium.bind(msg, callback)
@classmethod
def unbind(cls, msg):
_Medium.unbind(msg)
class Sender:
@classmethod
def send(cls, msg, param=None):
return _Medium.unicast(msg, param)
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/BingoLee1/FileSync.git
git@gitee.com:BingoLee1/FileSync.git
BingoLee1
FileSync
FileSync
master

搜索帮助