Python: Condition Variable Pattern

项目结构:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Condition Variable  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/10 21:12
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : settings.py
# 项目全局配置
TOTAL_BATCH = 3  # 每个工匠生产批次
ARTISAN_COUNT = 2  # 工匠数量
PRODUCE_DELAY = 0.5  # 生产耗时
INSPECT_DELAY = 0.3  # 质检耗时
START_WAIT_DELAY = 0.2  # 启动等待
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Condition Variable  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/10 21:13
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : jewelry.py
import threading
from dataclasses import dataclass
from typing import List
 
 
@dataclass
class Jewelry:
    """
    珠宝实体(数据封装)
    数据模型
    """
    artisan_id: int
    batch: int
 
    def __str__(self):
        return f"钻石#{self.artisan_id}-{self.batch}"
 
 
class JewelryInventory:
    """
    共享库存(线程安全封装)
    """
    def __init__(self):
        self._box: List[Jewelry] = []
        self._condition = threading.Condition()
 
    @property
    def condition(self):
        return self._condition
 
    @property
    def stock(self):
        return self._box.copy()
 
    @property
    def stock_count(self):
        return len(self._box)
 
    def is_empty(self):
        return len(self._box) == 0
 
 
    def put(self, jewelry: Jewelry):
        """
        放入珠宝
        :param jewelry:
        :return:
        """
        self._box.append(jewelry)
 
 
    def take(self) -> Jewelry:
        """
        取出珠宝
        :return:
        """
        return self._box.pop(0)
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Condition Variable  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/10 21:14
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : producer.py
from ConditionVariablePattern.model.jewelry import JewelryInventory, Jewelry
 
class ProductionService:
    """
    生产业务
    """
    def __init__(self, inventory: JewelryInventory):
        """
 
        :param inventory:
        """
        self.inventory = inventory
 
 
    def produce(self, artisan_id: int, batch: int) -> Jewelry:
        """
        生产并放入珠宝
        :param artisan_id:
        :param batch:
        :return:
        """
        jewelry = Jewelry(artisan_id, batch)
        with self.inventory.condition:
            self.inventory.put(jewelry)
            print(f"✅ 工匠放入珠宝:{jewelry} | 当前库存:{self.inventory.stock_count}")
            self.inventory.condition.notify()
        return jewelry
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Condition Variable  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/10 21:14
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : consumer.py
from ConditionVariablePattern.model.jewelry import JewelryInventory
 
class InspectionService:
    """
    质检业务
    """
    def __init__(self, inventory: JewelryInventory):
        """
 
        :param inventory:
        """
        self.inventory = inventory
        self.complete_count = 0
 
 
    def inspect(self, total_need: int) -> bool:
        """
        等待珠宝并质检
        :param total_need:
        :return:
        """
        with self.inventory.condition:
            # 等待库存非空
            while self.inventory.is_empty():
                print("🔍 珠宝箱为空,质检员等待...")
                self.inventory.condition.wait()
 
            # 取出并质检
            jewelry = self.inventory.take()
            self.complete_count += 1
            print(f"🛡️  质检员取出珠宝:{jewelry} | 当前库存:{self.inventory.stock_count}")
        return self.complete_count >= total_need
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: Condition Variable  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/10 21:20
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : artisan_thread.py
 
import threading
import time
from ConditionVariablePattern.config.settings import TOTAL_BATCH, PRODUCE_DELAY
from ConditionVariablePattern.service.producer import ProductionService
 
class ArtisanThread(threading.Thread):
    """
    工匠线程
    """
    def __init__(self, artisan_id: int, service: ProductionService):
        """
 
        :param artisan_id:
        :param service:
        """
        super().__init__()
        self.artisan_id = artisan_id
        self.service = service
 
    def run(self):
        """
 
        :return:
        """
        for batch in range(1, TOTAL_BATCH + 1):
            self.service.produce(self.artisan_id, batch)
            time.sleep(PRODUCE_DELAY)
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: Condition Variable  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/10 21:22
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : inspector_thread.py
import threading
import time
from ConditionVariablePattern.config.settings import INSPECT_DELAY, ARTISAN_COUNT, TOTAL_BATCH
from ConditionVariablePattern.service.consumer import InspectionService
 
class InspectorThread(threading.Thread):
    """
    质检员线程
    """
    def __init__(self, service: InspectionService):
        """
 
        :param service:
        """
        super().__init__()
        self.service = service
        self.total_need = ARTISAN_COUNT * TOTAL_BATCH
 
    def run(self):
        """
 
        :return:
        """
        while True:
            finished = self.service.inspect(self.total_need)
            if finished:
                break
            time.sleep(INSPECT_DELAY)

调用:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Condition Variable  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/10 21:19
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : ConditionVariableBll.py
'''
ConditionVariablePattern/
├── config/             # 配置层
│   └── settings.py     # 全局配置
├── model/              # 数据模型层
│   └── jewelry.py      # 珠宝、库存实体
├── service/            # 业务逻辑层
│   ├── producer.py     # 生产业务
│   └── consumer.py     # 质检业务
├── thread/             # 线程服务层
│   ├── artisan_thread.py  # 工匠线程
│   └── inspector_thread.py # 质检员线程
└── main.py             # 程序入口
'''
import time
from ConditionVariablePattern.config.settings import START_WAIT_DELAY
from ConditionVariablePattern.model.jewelry import JewelryInventory
from ConditionVariablePattern.service.producer import ProductionService
from ConditionVariablePattern.service.consumer import InspectionService
from ConditionVariablePattern.thread.artisan_thread import ArtisanThread
from ConditionVariablePattern.thread.inspector_thread import InspectorThread
 
 
class ConditionVariableBll(object):
    """
 
    """
    def demo(self):
        """
 
        :return:
        """
        # 1. 初始化共享资源
        inventory = JewelryInventory()
 
        # 2. 初始化业务服务
        production_service = ProductionService(inventory)
        inspection_service = InspectionService(inventory)
 
        # 3. 启动质检员
        inspector = InspectorThread(inspection_service)
        inspector.start()
        time.sleep(START_WAIT_DELAY)
 
        # 4. 启动工匠
        artisans = [
            ArtisanThread(1, production_service),
            ArtisanThread(2, production_service)
        ]
        for t in artisans:
            t.start()
 
        # 5. 等待所有线程完成
        for t in artisans:
            t.join()
        inspector.join()
 
        print("\n🎉 所有珠宝加工、质检完成!")
  

输出:

相关推荐
故事和你911 小时前
蓝桥杯-2026年C++B组省赛
开发语言·数据结构·c++·算法·蓝桥杯·动态规划·图论
yuanpan1 小时前
Python + Pillow 实战:开发一个图片批量格式转换工具
python·microsoft·pillow
wjs20241 小时前
HTML DOM 属性
开发语言
段ヤシ.1 小时前
回顾Java知识点,面试题汇总Day3(持续更新)
java·开发语言·windows
傻瓜搬砖人1 小时前
c语言绿皮书第三版第十一章习题
c语言·开发语言·算法·谭浩强·绿皮书第三版
YJlio1 小时前
2023-09-25:ChatGPT 开始支持“看、听、说”,从纯文本正式迈向多模态交互
人工智能·python·科技·chatgpt·django·交互·pygame
计算机安禾1 小时前
【c++面向对象编程】第3篇:类与对象(二):构造函数与析构函数
开发语言·c++·算法
技术工小李1 小时前
陆家嘴国泰人寿荣誉墙|iPad人脸识别人像大屏展示案例
python
不会写DN1 小时前
PyScript-GitHubRepo:构建高性能GitHub仓库批量下载工具的技术实践
开发语言·前端·python