python: Monitor Pattern

项目结构:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:监控模式 Monitor 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/5/17 20:30
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : settings.py
 
# 系统全局配置
class SystemConfig(object):
    """
    生产任务配置
    """
    TOTAL_PRODUCTION_TASKS = 10  # 总生产数量
    WORKER1_TASKS = 5            # 工匠1 生产数量
    WORKER2_TASKS = 5            # 工匠2 生产数量
 
    # 珠宝类型配置
    WORKER1_JEWELRY = "钻戒"
    WORKER1_MATERIAL = "钻石+铂金"
    WORKER2_JEWELRY = "黄金项链"
    WORKER2_MATERIAL = "足金999"
 
    # 模拟耗时配置(秒)
    PRODUCE_MIN_DELAY = 0
    PRODUCE_MAX_DELAY = 0.5
    CHECK_MIN_DELAY = 0.3
    CHECK_MAX_DELAY = 0.8
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:监控模式 Monitor 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/5/17 20:31
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : logger.py
 
from datetime import datetime
 
class SystemLogger:
    """
    统一日志工具类
    """
    @staticmethod
    def log(message: str) -> None:
        """
        带时间戳的标准日志输出
        :param message:
        :return:
        """
        timestamp = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        print(f"{timestamp} {message}")
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:监控模式 Monitor 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/5/17 20:30
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : jewelry.py
 
 
 
class Jewelry:
    """
    珠宝实体类
    """
    def __init__(self, jewelry_id: int, name: str, material: str):
        """
 
        :param jewelry_id:
        :param name:
        :param material:
        """
        self.id = jewelry_id      # 珠宝ID
        self.name = name          # 名称
        self.material = material  # 材质
 
    def __repr__(self):
        """
 
        :return:
        """
        return f"ID={self.id} | {self.name} | {self.material}"
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:监控模式 Monitor 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/5/17 20:33
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : monitor.py
 
import threading
from MonitorPattern.entity.jewelry import Jewelry
from MonitorPattern.utils.logger import SystemLogger
from MonitorPattern.config.settings import SystemConfig
 
class JewelryMonitor:
    """
    监控器:线程安全的生产-消费缓冲区(Monitor 模式标准实现)
    """
    _instance = None  # 单例模式
    _lock = threading.Lock()
 
    def __new__(cls):
        """
        单例:全局唯一监控器
        """
        with cls._lock:
            if cls._instance is None:
                cls._instance = super().__new__(cls)
                cls._instance.init()
            return cls._instance
 
    def init(self):
        """
        线程同步
        :return:
        """
        self.mutex = threading.Lock()
        self.cond = threading.Condition(self.mutex)
 
        # 共享资源
        self.jewelry_queue: list[Jewelry] = []
        self.jewelry_id = 1
 
        # 任务计数
        self.produced_count = 0
        self.checked_count = 0
        self.total_tasks = SystemConfig.TOTAL_PRODUCTION_TASKS
 
    def produce(self, worker_name: str, jewelry_name: str, material: str) -> bool:
        """
        生产:原子操作,线程安全"
        :param worker_name:
        :param jewelry_name:
        :param material:
        :return:
        """
        with self.mutex:
            # 创建珠宝实体
            jewelry = Jewelry(self.jewelry_id, jewelry_name, material)
            self.jewelry_queue.append(jewelry)
 
            # 日志
            SystemLogger.log(f"[{worker_name}] 生产完成: {jewelry_name} | {material}")
 
            # 计数
            self.jewelry_id += 1
            self.produced_count += 1
 
            # 唤醒消费者
            self.cond.notify()
 
            # 返回是否生产完成
            return self.produced_count == self.total_tasks
 
    def consume(self, inspector_name: str) -> bool:
        """
        消费:原子操作,线程安全
        :param inspector_name:
        :return:
        """
        with self.mutex:
            # 等待条件
            while not self.jewelry_queue and self.produced_count < self.total_tasks:
                self.cond.wait()
 
            # 消费
            if self.jewelry_queue:
                jewelry = self.jewelry_queue.pop(0)
                SystemLogger.log(f"[{inspector_name}] 质检完成: {jewelry}")
                self.checked_count += 1
 
            # 返回是否全部质检完成
            return self.checked_count == self.total_tasks
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:监控模式 Monitor 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/5/17 20:35
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : producer.py
import time
import random
from MonitorPattern.core.monitor import JewelryMonitor
from MonitorPattern.utils.logger import SystemLogger
from MonitorPattern.config.settings import SystemConfig
 
class JewelryProducer:
    """
    生产者
    """
    def __init__(self, name: str, jewelry_name: str, material: str, task_num: int):
        """
 
        :param name:
        :param jewelry_name:
        :param material:
        :param task_num:
        """
        self.name = name
        self.jewelry_name = jewelry_name
        self.material = material
        self.task_num = task_num
        self.monitor = JewelryMonitor()
 
    def run(self):
        """
        执行生产任务
        :return:
        """
        for _ in range(self.task_num):
            # 模拟生产耗时
            time.sleep(random.uniform(
                SystemConfig.PRODUCE_MIN_DELAY,
                SystemConfig.PRODUCE_MAX_DELAY
            ))
            # 生产
            finished = self.monitor.produce(
                self.name,
                self.jewelry_name,
                self.material
            )
            # 完成标记
            if finished:
                SystemLogger.log(f"[{self.name}] ✅ 全部生产任务完成")
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:监控模式 Monitor 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/5/17 20:36
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : consumer.py
 
import time
import random
from MonitorPattern.core.monitor import JewelryMonitor
from MonitorPattern.utils.logger import SystemLogger
from MonitorPattern.config.settings import SystemConfig
 
class JewelryConsumer:
    """
    消费者:
    """
    def __init__(self, name: str):
        """
 
        :param name:
        """
        self.name = name
        self.monitor = JewelryMonitor()
 
    def run(self):
        """
        执行质检任务
        :return:
        """
        while True:
            # 模拟质检耗时
            time.sleep(random.uniform(
                SystemConfig.CHECK_MIN_DELAY,
                SystemConfig.CHECK_MAX_DELAY
            ))
            # 质检
            finished = self.monitor.consume(self.name)
            if finished:
                SystemLogger.log(f"[{self.name}] ✅ 全部质检任务完成")
                break

调用:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:监控模式 Monitor 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/5/17 20:38
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : MonitorBll.py
"""
Monitor/
├── config/                # 配置层
│   └── settings.py        # 全局配置
├── core/                  # 核心业务层
│   ├── monitor.py         # Monitor 模式实现(线程安全监控器)
│   ├── producer.py        # 生产者(工匠)
│   └── consumer.py        # 消费者(质检员)
├── entity/                # 实体层
│   └── jewelry.py         # 珠宝实体类
├── utils/                 # 工具层
│   └── logger.py          # 日志工具(统一时间戳)
└── main.py                # 系统入口
"""
import threading
from MonitorPattern.utils.logger import SystemLogger
from MonitorPattern.core.producer import JewelryProducer
from MonitorPattern.core.consumer import JewelryConsumer
from MonitorPattern.config.settings import SystemConfig
 
 
class MonitorBll(object):
    """
 
    """
    def demo(self):
        """
 
        :return:
        """
        # 日志:系统启动
        SystemLogger.log("=== 珠宝生产-质检系统 启动 ===")
 
        # ========== 初始化角色 ==========
        # 工匠1
        worker1 = JewelryProducer(
            name="工匠1",
            jewelry_name=SystemConfig.WORKER1_JEWELRY,
            material=SystemConfig.WORKER1_MATERIAL,
            task_num=SystemConfig.WORKER1_TASKS
        )
 
        # 工匠2
        worker2 = JewelryProducer(
            name="工匠2",
            jewelry_name=SystemConfig.WORKER2_JEWELRY,
            material=SystemConfig.WORKER2_MATERIAL,
            task_num=SystemConfig.WORKER2_TASKS
        )
 
        # 质检员
        inspector = JewelryConsumer(name="质检员")
 
        # ========== 创建线程 ==========
        t1 = threading.Thread(target=worker1.run, name="工匠1")
        t2 = threading.Thread(target=worker2.run, name="工匠2")
        t3 = threading.Thread(target=inspector.run, name="质检员")
 
        # ========== 启动 ==========
        t1.start()
        t2.start()
        t3.start()
 
        # ========== 等待结束 ==========
        t1.join()
        t2.join()
        t3.join()
 
        # 系统完成
        SystemLogger.log("=== 🎉 珠宝生产-质检全流程完成 ===")

输出:

相关推荐
财经资讯数据_灵砚智能16 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月6日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
Land032916 小时前
Python + RPA 双引擎实战:从手写脚本到可交付自动化应用的完整链路
python·自动化·rpa
菜到离谱但坚持17 小时前
【小白零基础】RAG+LangChain 搭建私有知识库问答系统(完整可运行代码+超详细教程+避坑指南)
python·langchain·rag
知识的宝藏17 小时前
Xpaht self::div 轴语法
开发语言
keykey6.17 小时前
卷积神经网络(CNN):让AI学会“看“
开发语言·人工智能·深度学习·机器学习
ss27317 小时前
【入门OJ题解】分苹果问题(Python/Java/C 实现)
java·c语言·python
IsJunJianXin17 小时前
谷歌搜索cookie NID逆向生成
开发语言·python·google搜索·sgss·nid-cookie·算法生成nid·google-cookie
暗夜猎手-大魔王17 小时前
转载--Hermes Agent 11 | 智能审批与平台化安全:当 AI 来守护 AI
人工智能·python·安全
AIFQuant17 小时前
量化私募回测系统:高质量股票/外汇历史数据 API 选型与接入
python·websocket·金融·ai量化
Mr.Daozhi17 小时前
Playwright实战:抓取Meta Ad Library动态页面的三级降级策略
爬虫·python·自动化·playwright·meta广告