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🎉 所有珠宝加工、质检完成!")
  

输出:

相关推荐
星空椰2 小时前
Python 面向对象高级:继承与类定义详解
开发语言·python
白露与泡影2 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
凯瑟琳.奥古斯特2 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
风之所往_2 小时前
Python 3.4 新特性全面总结
python
雪度娃娃3 小时前
转向现代C++——在意为改写的函数添加 override
开发语言·c++
太阳上的雨天3 小时前
任何格式的文件转Markdown
python·ai
yaoxin5211233 小时前
419. 现代 Java IO 最佳实践 - 写入文本文件
java·windows·python
喵星人工作室4 小时前
C++火影忍者1.1.2
开发语言·c++
weixin_468466854 小时前
纳米 AI 搜索新手极速上手指南
人工智能·python·深度学习·搜索引擎·ai·语言模型·自然语言处理
凯瑟琳.奥古斯特4 小时前
数据库原理选择题精选
数据库·python·职场和发展