Files
everything-is-suitable/everything-is-suitable-test/python_e2e/test_concurrency_control_demo.py
T
张翔 08ea5fbe98 feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
2026-03-28 14:37:29 +08:00

289 lines
7.2 KiB
Python

#!/usr/bin/env python3
"""
本地并发控制模块演示脚本
展示本地并发控制的核心功能。
"""
import time
import threading
from core.concurrency_control import (
SemaphoreControl,
ReadWriteLock,
RateLimiter,
LocalDistributedLock,
ConcurrentCounter,
ThreadBarrier,
BoundedTaskQueue,
concurrency_manager,
)
def demo_semaphore():
"""演示信号量"""
print("\n" + "="*60)
print("演示1: 信号量并发控制")
print("="*60)
semaphore = SemaphoreControl(max_concurrent=3)
active_count = [0]
max_active = [0]
lock = threading.Lock()
def worker():
with semaphore.acquire():
with lock:
active_count[0] += 1
max_active[0] = max(max_active[0], active_count[0])
time.sleep(0.2)
with lock:
active_count[0] -= 1
threads = [threading.Thread(target=worker) for _ in range(10)]
for t in threads:
t.start()
for t in threads:
t.join()
print(f"✅ 10个线程执行完成")
print(f"✅ 最大并发数: {max_active[0]} (限制为3)")
print(f"✅ 统计: {semaphore.get_stats()}")
def demo_read_write_lock():
"""演示读写锁"""
print("\n" + "="*60)
print("演示2: 读写锁")
print("="*60)
rw_lock = ReadWriteLock()
data = {"value": 0}
def reader():
with rw_lock.read_lock():
_ = data["value"]
time.sleep(0.05)
def writer():
with rw_lock.write_lock():
data["value"] += 1
time.sleep(0.05)
# 5个读线程
read_threads = [threading.Thread(target=reader) for _ in range(5)]
# 2个写线程
write_threads = [threading.Thread(target=writer) for _ in range(2)]
for t in read_threads + write_threads:
t.start()
for t in read_threads + write_threads:
t.join()
print(f"✅ 5个读线程 + 2个写线程执行完成")
print(f"✅ 最终数据值: {data['value']}")
def demo_rate_limiter():
"""演示限流器"""
print("\n" + "="*60)
print("演示3: 限流器")
print("="*60)
limiter = RateLimiter(max_requests=5, time_window=1)
# 前5个请求应该通过
allowed = 0
for i in range(5):
if limiter.allow_request():
allowed += 1
print(f"✅ 前5个请求通过: {allowed}")
# 超出限制应该被阻止
blocked = 0
for i in range(3):
if not limiter.allow_request():
blocked += 1
print(f"✅ 超出限制被阻止: {blocked}")
# 等待时间窗口重置
print("⏱️ 等待1.1秒...")
time.sleep(1.1)
reset_allowed = 0
for i in range(3):
if limiter.allow_request():
reset_allowed += 1
print(f"✅ 重置后通过: {reset_allowed}")
print(f"✅ 统计: {limiter.get_stats()}")
def demo_distributed_lock():
"""演示分布式锁"""
print("\n" + "="*60)
print("演示4: 分布式锁(本地模拟)")
print("="*60)
lock = LocalDistributedLock("test_resource")
acquired_count = [0]
lock_obj = threading.Lock()
def try_acquire():
if lock.acquire(timeout=0.5):
with lock_obj:
acquired_count[0] += 1
time.sleep(0.2)
lock.release()
threads = [threading.Thread(target=try_acquire) for _ in range(5)]
for t in threads:
t.start()
for t in threads:
t.join()
print(f"✅ 5个线程尝试获取锁")
print(f"✅ 成功获取锁次数: {acquired_count[0]}")
# 测试超时释放
lock2 = LocalDistributedLock("test_resource2", expire_seconds=1)
lock2.acquire()
print("✅ 获取锁(1秒过期)")
time.sleep(1.2)
assert lock2.acquire(), "超时后应该可以重新获取锁"
print("✅ 超时后成功重新获取锁")
lock2.release()
def demo_concurrent_counter():
"""演示并发计数器"""
print("\n" + "="*60)
print("演示5: 并发计数器")
print("="*60)
counter = ConcurrentCounter(initial_value=0)
def increment_worker():
for _ in range(100):
counter.increment()
threads = [threading.Thread(target=increment_worker) for _ in range(10)]
for t in threads:
t.start()
for t in threads:
t.join()
print(f"✅ 10个线程各递增100次")
print(f"✅ 最终计数值: {counter.get_value()} (期望: 1000)")
# 递减
def decrement_worker():
for _ in range(50):
counter.decrement()
threads = [threading.Thread(target=decrement_worker) for _ in range(5)]
for t in threads:
t.start()
for t in threads:
t.join()
print(f"✅ 5个线程各递减50次")
print(f"✅ 最终计数值: {counter.get_value()} (期望: 750)")
def demo_barrier():
"""演示屏障"""
print("\n" + "="*60)
print("演示6: 线程屏障")
print("="*60)
barrier = ThreadBarrier(parties=3)
arrival_times = []
lock = threading.Lock()
def worker():
time.sleep(0.05)
barrier.wait()
with lock:
arrival_times.append(time.time())
threads = [threading.Thread(target=worker) for _ in range(3)]
start_time = time.time()
for t in threads:
t.start()
for t in threads:
t.join()
max_diff = max(arrival_times) - min(arrival_times)
print(f"✅ 3个线程通过屏障")
print(f"✅ 最大到达时间差: {max_diff:.4f}s")
def demo_bounded_queue():
"""演示有界队列"""
print("\n" + "="*60)
print("演示7: 有界任务队列")
print("="*60)
queue = BoundedTaskQueue(max_size=3)
# 添加3个任务
for i in range(3):
queue.put(f"task_{i}")
print("✅ 添加3个任务")
# 尝试添加第4个(应该阻塞)
print("⏱️ 尝试添加第4个任务(应该超时)...")
try:
queue.put("overflow_task", timeout=0.1)
print("⚠️ 添加成功(意外)")
except TimeoutError:
print("✅ 队列满时正确阻塞")
# 消费任务
tasks = []
for _ in range(3):
tasks.append(queue.get(timeout=0.1))
print(f"✅ 消费任务: {tasks}")
def demo_manager():
"""演示并发管理器"""
print("\n" + "="*60)
print("演示8: 并发控制器管理器")
print("="*60)
# 创建命名信号量
semaphore = concurrency_manager.create_semaphore("api_limit", max_concurrent=5)
print("✅ 创建命名信号量: api_limit")
# 获取已创建的组件
retrieved = concurrency_manager.get_semaphore("api_limit")
print(f"✅ 获取信号量: {retrieved is semaphore}")
# 获取统计信息
stats = concurrency_manager.get_all_stats()
print(f"✅ 统计信息: {stats}")
def main():
"""主函数"""
print("\n" + "="*60)
print("本地并发控制模块演示")
print("="*60)
demo_semaphore()
demo_read_write_lock()
demo_rate_limiter()
demo_distributed_lock()
demo_concurrent_counter()
demo_barrier()
demo_bounded_queue()
demo_manager()
print("\n" + "="*60)
print("✅ 所有演示完成!")
print("="*60)
if __name__ == "__main__":
main()