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("=== 🎉 珠宝生产-质检全流程完成 ===")

输出:

相关推荐
Naisu Xu1 小时前
Mac上安装Homebrew、Git、Python等环境记录
git·python·macos·终端·brew
之歆1 小时前
DAY_11JavaScript BOM与DOM深度解析:底层原理与工程实践(上)
开发语言·前端·javascript·ecmascript
老纪1 小时前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
会编程的土豆1 小时前
Go ini 配置加载:`ini.MapTo` 详细解析
开发语言·数据库·golang
ChoSeitaku1 小时前
04.数组
java·开发语言·数据结构
小郑加油1 小时前
python学习Day14:实际应用——pandas的筛选与保存
python·学习·pandas
workflower1 小时前
人工智能全球治理
大数据·人工智能·设计模式·机器人·动态规划
workflower1 小时前
AI灵活高效的智慧用能核心场景
大数据·人工智能·设计模式·机器人·动态规划
techdashen1 小时前
半小时读懂 Rust:从语法符号到所有权思维
开发语言·rust