项目结构:

python
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Bounded Parallelism 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/30 21:34
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : settings.py
"""
全局配置文件
遵循:配置与代码分离
"""
import os
# ====================== 核心并行配置 ======================
# 最大并发数(根据服务器/打印机/接口限制调整)
MAX_PARALLEL_TASKS = 10
# ====================== 业务配置 ======================
# 批量首饰数量
TOTAL_JEWELRY_COUNT = 20
# 宝石品类
GEM_TYPES = [
"黄金", "铂金", "18K金", "钻石", "红宝石",
"蓝宝石", "祖母绿", "珍珠", "翡翠", "银饰"
]
# ====================== 路径配置 ======================
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LOG_DIR = os.path.join(BASE_DIR, "logs")
# 自动创建日志目录
os.makedirs(LOG_DIR, exist_ok=True)
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:15
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : concurrency.py
"""
并发工具类
封装:有界并行(Bounded Parallelism)核心实现
企业级通用,可复用于所有项目
"""
import time
import logging
from concurrent.futures import ThreadPoolExecutor
from threading import BoundedSemaphore
logger = logging.getLogger(__name__)
class BoundedParallelExecutor:
"""
有界并行执行器
严格限制最大并发数,保护系统资源
"""
def __init__(self, max_parallel: int):
self.max_parallel = max_parallel
self.semaphore = BoundedSemaphore(max_parallel)
logger.info(f"✅ 初始化有界并行器 | 最大并发任务数: {max_parallel}")
def run_task(self, func, params_list: list, task_name: str = "任务"):
"""
批量执行任务
:param func: 任务函数
:param params_list: 参数列表
:param task_name: 任务名称(用于日志)
:return: 执行结果列表
"""
start_time = time.time()
logger.info(f"🚀 开始执行【{task_name}】| 总任务数: {len(params_list)}")
# 包装函数:注入信号量控制
def wrapped_task(param):
with self.semaphore:
try:
return func(param)
except Exception as e:
logger.error(f"❌ 【{task_name}】执行失败 | 参数: {param} | 错误: {str(e)}")
return None
# 线程池执行
with ThreadPoolExecutor(max_workers=self.max_parallel) as executor:
results = list(executor.map(wrapped_task, params_list))
# 统计耗时
cost_time = time.time() - start_time
success_count = len([r for r in results if r is not None])
logger.info(
f"🏁 【{task_name}】执行完成 | 成功: {success_count}/{len(params_list)} | 总耗时: {cost_time:.2f}s")
return results
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:17
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : certificate.py
"""
珠宝鉴定证书生成任务
单一职责:只实现证书生成逻辑
"""
import time
import random
import logging
logger = logging.getLogger(__name__)
def generate_certificate(jewelry_id: int) -> str:
"""
生成珠宝鉴定证书
:param jewelry_id:
:return:
"""
logger.debug(f"[证书生成] 处理首饰编号: {jewelry_id}")
time.sleep(random.uniform(0.5, 1.5))
return f"证书_{jewelry_id}.pdf"
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:17
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : image.py
"""
珠宝图片处理任务
"""
import time
import random
import logging
logger = logging.getLogger(__name__)
def process_image(jewelry_id: int) -> str:
"""
图片压缩 + 水印
:param jewelry_id:
:return:
"""
logger.debug(f"[图片处理] 处理首饰编号: {jewelry_id}")
time.sleep(random.uniform(0.3, 1.2))
return f"压缩图_{jewelry_id}.jpg"
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:18
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : price.py
"""
金价/宝石价格同步任务
"""
import time
import random
import logging
logger = logging.getLogger(__name__)
def sync_gem_price(gem_type: str) -> dict:
"""
同步宝石价格
:param gem_type:
:return:
"""
logger.debug(f"[价格同步] 更新: {gem_type}")
time.sleep(random.uniform(0.2, 0.8))
price = round(random.uniform(300, 600), 2)
return {gem_type: price}
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:18
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : barcode.py
"""
珠宝条码标签生成任务
"""
import time
import random
import logging
logger = logging.getLogger(__name__)
def generate_barcode(jewelry_id: int) -> str:
"""
生成条码标签
:param jewelry_id:
:return:
"""
logger.debug(f"[条码生成] 生成编号: {jewelry_id}")
time.sleep(random.uniform(0.4, 1.0))
return f"条码_{jewelry_id}.png"
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:19
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : jewelry_service.py
"""
珠宝业务核心服务
编排所有批量任务,对外提供统一调用入口
"""
import logging
from BoundedParallelismPattern.config.settings import MAX_PARALLEL_TASKS, TOTAL_JEWELRY_COUNT, GEM_TYPES
from BoundedParallelismPattern.utils.concurrency import BoundedParallelExecutor
from BoundedParallelismPattern.tasks import certificate, image, price, barcode
logger = logging.getLogger(__name__)
class JewelryBatchService:
"""
珠宝全流程批量服务
"""
def __init__(self):
# 初始化有界并行器(全局唯一)
self.executor = BoundedParallelExecutor(MAX_PARALLEL_TASKS)
# 生成任务参数
self.jewelry_ids = list(range(1, TOTAL_JEWELRY_COUNT + 1))
self.gem_types = GEM_TYPES
def run_all_batch_tasks(self):
"""执行所有批量任务(全业务流程)"""
logger.info("=" * 60)
logger.info("🏭 珠宝工厂企业级批量任务启动")
logger.info("=" * 60)
# 1. 鉴定证书
self.executor.run_task(
func=certificate.generate_certificate,
params_list=self.jewelry_ids,
task_name="珠宝鉴定证书生成"
)
# 2. 图片处理
self.executor.run_task(
func=image.process_image,
params_list=self.jewelry_ids,
task_name="珠宝图片压缩水印"
)
# 3. 价格同步
self.executor.run_task(
func=price.sync_gem_price,
params_list=self.gem_types,
task_name="全球宝石金价同步"
)
# 4. 条码标签
self.executor.run_task(
func=barcode.generate_barcode,
params_list=self.jewelry_ids,
task_name="珠宝条码标签生成"
)
logger.info("=" * 60)
logger.info("✅ 珠宝全业务批量任务执行完成")
logger.info("=" * 60)
调用:
python
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:20
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : BoundedParallelismBll.py
import logging
import os
import sys
from BoundedParallelismPattern.config.settings import LOG_DIR
from BoundedParallelismPattern.services.jewelry_service import JewelryBatchService
class BoundedParallelismBll(object):
"""
"""
def demo(self):
"""
:return:
"""
# ====================== 全局日志配置 ======================
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
handlers=[
logging.FileHandler(os.path.join(LOG_DIR, "jewelry_task.log"), encoding="utf-8"),
logging.StreamHandler(sys.stdout)
]
)
logger = logging.getLogger(__name__)
try:
# 创建服务实例
jewelry_service = JewelryBatchService()
# 执行全流程任务
jewelry_service.run_all_batch_tasks()
except KeyboardInterrupt:
logger.warning("⚠️ 用户手动终止任务")
sys.exit(0)
except Exception as e:
logger.critical(f"💥 系统异常终止: {str(e)}", exc_info=True)
sys.exit(1)
输出:
