news 2026/6/16 1:14:04

python: Reactor Pattern

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python: Reactor Pattern

项目结构:

# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:49 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : constants.py from enum import Enum class BusinessEventType(Enum): """ 珠宝行业全部业务事件类型枚举,统一管理 """ RAW_MATERIAL = "raw_material" # 原料采购验收 PROCESS_CHECK = "process_check" # 加工质检 STORE_SALE = "sale" # 门店销售结算 AFTER_SALE_REPAIR = "repair" # 售后维修 INVENTORY_CHECK = "inventory" # 库存盘点 # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:49 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : exceptions.py class HandlerNotFoundError(Exception): """ 事件无对应处理器异常 """ pass class InvalidEventDataError(Exception): """ 事件请求数据非法异常 """ pass # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:50 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : logger.py import logging import sys def get_logger(name: str = "jewelry_reactor") -> logging.Logger: """ :param name: :return: """ logger = logging.getLogger(name) logger.setLevel(logging.INFO) if not logger.handlers: fmt = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s", "%Y-%m-%d %H:%M:%S") sh = logging.StreamHandler(sys.stdout) sh.setFormatter(fmt) logger.addHandler(sh) return logger # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:53 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : base_handler.py from abc import ABC, abstractmethod from ReactorPattern.event import BusinessEvent class BaseHandler(ABC): """ 所有业务处理器抽象基类,统一规范接口 """ @abstractmethod def handle(self, event: BusinessEvent) -> None: """ 处理对应业务事件 :param event: :return: """ pass # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:54 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : material_handler.py from .base_handler import BaseHandler from ReactorPattern.event import BusinessEvent from ReactorPattern.common import get_logger logger = get_logger("material_handler") class MaterialAcceptHandler(BaseHandler): """ 原料采购 """ def handle(self, event: BusinessEvent) -> None: """ :param event: :return: """ payload = event.payload mat_type = payload["material_type"] purity = payload["purity"] weight = payload["weight"] logger.info(f"===== 原料采购验收业务开始 =====") logger.info(f"原料:{mat_type} | 纯度:{purity} | 重量:{weight}g") logger.info(f"{mat_type}原料验收合格,入库完成") # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:56 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : process_handler.py from .base_handler import BaseHandler from ReactorPattern.event import BusinessEvent from ReactorPattern.common import get_logger logger = get_logger("process_handler") class ProcessCheckHandler(BaseHandler): """ 加工质检 """ def handle(self, event: BusinessEvent) -> None: """ :param event: :return: """ payload = event.payload style = payload["style"] cert_no = payload["cert_no"] craft = payload["craft"] logger.info(f"===== 珠宝加工质检业务开始 =====") logger.info(f"款式:{style} | GIA证书号:{cert_no} | 工艺标准:{craft}") logger.info(f"{style}工艺、证书全部合规,成品入库") # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:57 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : sale_handler.py from .base_handler import BaseHandler from ReactorPattern.event import BusinessEvent from ReactorPattern.common import get_logger logger = get_logger("sale_handler") class StoreSaleHandler(BaseHandler): """ 门店销售结算 """ def handle(self, event: BusinessEvent) -> None: """ :param event: :return: """ payload = event.payload product = payload["product_name"] price = payload["unit_price"] qty = payload["quantity"] order_id = payload["order_id"] total = price * qty logger.info(f"===== 门店销售结算业务开始 =====") logger.info(f"商品:{product} | 单价:{price}元 | 数量:{qty}件") logger.info(f"订单{order_id},结算总价:{total}元,销售完成") # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:58 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : repair_handler.py from .base_handler import BaseHandler from ReactorPattern.event import BusinessEvent from ReactorPattern.common import get_logger logger = get_logger("repair_handler") class AfterSaleRepairHandler(BaseHandler): """ 售后维修 """ def handle(self, event: BusinessEvent) -> None: """ :param event: :return: """ payload = event.payload customer = payload["customer_name"] jewel = payload["jewelry_name"] item = payload["repair_item"] logger.info(f"===== 售后维修业务开始 =====") logger.info(f"客户:{customer} | 饰品:{jewel} | 维修项目:{item}") logger.info(f"{item}服务完工,客户可取件") # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 20:59 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : inventory_handler.py from .base_handler import BaseHandler from ReactorPattern.event import BusinessEvent from ReactorPattern.common import get_logger logger = get_logger("inventory_handler") class InventoryCheckHandler(BaseHandler): """ 库存盘点 """ def handle(self, event: BusinessEvent) -> None: """ :param event: :return: """ payload = event.payload inv_type = payload["inventory_type"] total_num = payload["total_num"] total_val = payload["total_value"] logger.info(f"===== 库存盘点业务开始 =====") logger.info(f"盘点类目:{inv_type} | 在库总数:{total_num}件 | 库存总价值:{total_val}万元") logger.info(f"账实核对一致,库存台账更新完成")
# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 21:00 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : demultiplexer.py from typing import Dict from ReactorPattern.common import BusinessEventType, HandlerNotFoundError from ReactorPattern.handler import BaseHandler class EventDemultiplexer: """ 事件分离器:维护事件类型与处理器映射,负责匹配分发 """ def __init__(self): self._handler_map: Dict[BusinessEventType, BaseHandler] = {} def register_handler(self, event_type: BusinessEventType, handler: BaseHandler) -> None: """ 注册事件与处理器绑定关系,扩展新增业务只需要注册 :param event_type: :param handler: :return: """ self._handler_map[event_type] = handler def get_handler(self, event_type: BusinessEventType) -> BaseHandler: """ 根据事件类型查找对应处理器,无则抛异常 :param event_type: :return: """ if event_type not in self._handler_map: raise HandlerNotFoundError(f"未注册处理器:{event_type.value}") return self._handler_map[event_type] # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 21:02 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : reactor_core.py from ReactorPattern.event import BusinessEvent from ReactorPattern.reactor import EventDemultiplexer from ReactorPattern.common import get_logger logger = get_logger("reactor_core") class JewelryReactor: """ 珠宝行业Reactor反应器,统一接收并发事件、调用分离器分发 """ def __init__(self, demultiplexer: EventDemultiplexer): self._demux = demultiplexer def dispatch(self, event: BusinessEvent) -> None: """ 对外统一入口:接收任意业务事件,自动分发处理 :param event: :return: """ logger.info(f"Reactor收到业务事件:{event.event_type.value}") handler = self._demux.get_handler(event.event_type) handler.handle(event) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 21:05 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : app.py from .common import BusinessEventType, get_logger from .event import BusinessEvent from .reactor import EventDemultiplexer, JewelryReactor from .handler import ( MaterialAcceptHandler, ProcessCheckHandler, StoreSaleHandler, AfterSaleRepairHandler, InventoryCheckHandler ) logger = get_logger("app") def build_reactor() -> JewelryReactor: """ 依赖组装:统一注册所有业务处理器,工厂化构建Reactor :return: """ demux = EventDemultiplexer() # 注册所有珠宝业务处理器 demux.register_handler(BusinessEventType.RAW_MATERIAL, MaterialAcceptHandler()) demux.register_handler(BusinessEventType.PROCESS_CHECK, ProcessCheckHandler()) demux.register_handler(BusinessEventType.STORE_SALE, StoreSaleHandler()) demux.register_handler(BusinessEventType.AFTER_SALE_REPAIR, AfterSaleRepairHandler()) demux.register_handler(BusinessEventType.INVENTORY_CHECK, InventoryCheckHandler()) reactor = JewelryReactor(demultiplexer=demux) return reactor def simulate_concurrent_business_requests(reactor: JewelryReactor): """ 模拟多并发业务请求,统一封装为标准Event对象送入Reactor :param reactor: :return: """ event_list = [ BusinessEvent( event_type=BusinessEventType.RAW_MATERIAL, payload={"material_type": "足金999", "purity": "99.9%", "weight": 800} ), BusinessEvent( event_type=BusinessEventType.PROCESS_CHECK, payload={"style": "1克拉钻戒", "cert_no": "GIA987654321", "craft": "微镶精工"} ), BusinessEvent( event_type=BusinessEventType.STORE_SALE, payload={"product_name": "古法传承金镯", "unit_price": 15680, "quantity": 1, "order_id": "JEW20260615001"} ), BusinessEvent( event_type=BusinessEventType.AFTER_SALE_REPAIR, payload={"customer_name": "李女士", "jewelry_name": "18K金项链", "repair_item": "断裂焊接+抛光翻新"} ), BusinessEvent( event_type=BusinessEventType.INVENTORY_CHECK, payload={"inventory_type": "钻石成品库存", "total_num": 1680, "total_value": 12600} ) ] # 循环推送所有并发事件给Reactor分发 for evt in event_list: reactor.dispatch(evt)

调用:

# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Reactor Pattern 反应器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/15 21:07 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : ReactorBll.py from ReactorPattern.common import get_logger from ReactorPattern.reactor import JewelryReactor from ReactorPattern.app import build_reactor, simulate_concurrent_business_requests logger = get_logger("ReactorBll") class ReactorBll(object): """ Reactor 业务逻辑封装层 对外提供统一调用入口,隐藏内部构建、分发、调度细节 """ def __init__(self): # 内部初始化 Reactor 实例(一次创建,多次复用) self._reactor: JewelryReactor = build_reactor() def demo(self): """ 对外演示方法:一键执行全套珠宝行业并发业务流程 :return: None """ logger.info("========== ReactorBll.demo() 开始执行 ==========") # 执行并发业务模拟 simulate_concurrent_business_requests(self._reactor) logger.info("========== ReactorBll.demo() 执行完成 ==========") def get_reactor(self) -> JewelryReactor: """ 提供内部 reactor 实例,方便外部扩展调用(可选) """ return self._reactor

输出:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 1:12:52

协同过滤实战:从Netflix数据到工业级推荐系统

1. 这不是教科书里的“协同过滤”,而是我在真实项目里踩过坑、调过参、跑通全链路的实操笔记你打开任何一篇讲协同过滤(Collaborative Filtering)的教程,十有八九会从“用户-物品矩阵”“相似度计算”“邻居选择”这些词开始。听起…

作者头像 李华
网站建设 2026/6/16 1:11:04

【CANdelaStudio-从入门到深入到实战】18 诊断会话管理:会话切换是如何成为ECU的“交通警察”的?

开篇故事:一次“合法”的诊断事故 去年冬天,我帮一家主机厂排查一个诡异问题:某款量产车型在产线终检时,ECU突然“死机”——所有诊断服务返回0x78(请求正确接收,但响应待定),持续30秒后自动恢复。产线工人急得跳脚,因为每台车要多等半分钟。 我们抓取CAN日志后发现…

作者头像 李华
网站建设 2026/6/16 1:09:39

Forza Mods AIO:终极地平线4和5免费修改工具完全指南

Forza Mods AIO:终极地平线4和5免费修改工具完全指南 【免费下载链接】Forza-Mods-AIO Free and open-source FH4 & FH5 mod tool 项目地址: https://gitcode.com/gh_mirrors/fo/Forza-Mods-AIO Forza Mods AIO是一款专为极限竞速地平线4和地平线5玩家设…

作者头像 李华
网站建设 2026/6/16 1:07:10

2026节气精准计算算法解析:如何确保八字排盘的时间基准分秒不差?

2026节气精准计算算法解析:如何确保八字排盘的时间基准分秒不差?二十四节气精准计算的底层算法核心,在于必须摒弃传统的固定平气法,全面引入基于国际天文常数的视黄经瞬时差值计算,才能在排盘系统中确保交节时刻达到秒…

作者头像 李华
网站建设 2026/6/16 1:06:51

EZCard卡牌生成器:3步完成桌游卡牌批量设计的终极指南

EZCard卡牌生成器:3步完成桌游卡牌批量设计的终极指南 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca/Card…

作者头像 李华