[ PROMPT_NODE_27416 ]
Simpy 事件
[ SKILL_DOCUMENTATION ]
# SimPy 事件系统
本指南涵盖了 SimPy 中的事件系统,它是离散事件模拟的基础。
## 事件基础
事件是控制模拟流程的核心机制。流程产生(yield)事件并在这些事件被触发时恢复执行。
### 事件生命周期
事件经历三个状态:
1. **未触发 (Not triggered)** - 作为内存对象的初始状态
2. **已触发 (Triggered)** - 在事件队列中调度;`triggered` 属性为 `True`
3. **已处理 (Processed)** - 从队列中移除并执行回调;`processed` 属性为 `True`
python
import simpy
env = simpy.Environment()
# 创建一个事件
event = env.event()
print(f'Triggered: {event.triggered}, Processed: {event.processed}') # 均为 False
# 触发事件
event.succeed(value='Event result')
print(f'Triggered: {event.triggered}, Processed: {event.processed}') # True, False
# 运行以处理事件
env.run()
print(f'Triggered: {event.triggered}, Processed: {event.processed}') # True, True
print(f'Value: {event.value}') # 'Event result'
## 核心事件类型
### 超时 (Timeout)
控制模拟中的时间进程。最常见的事件类型。
python
import simpy
def process(env):
print(f'Starting at {env.now}')
yield env.timeout(5)
print(f'Resumed at {env.now}')
# 带值的超时
result = yield env.timeout(3, value='Done')
print(f'Result: {result} at {env.now}')
env = simpy.Environment()
env.process(process(env))
env.run()
**用法:**
- `env.timeout(delay)` - 等待指定时间
- `env.timeout(delay, value=val)` - 等待并返回一个值
### 流程事件 (Process Events)
流程本身就是事件,允许流程等待其他流程完成。
python
import simpy
def worker(env, name, duration):
print(f'{name} starting at {env.now}')
yield env.timeout(duration)
print(f'{name} finished at {env.now}')
return f'{name} result'
def coordinator(env):
# 启动工作流程
worker1 = env.process(worker(env, 'Worker 1', 5))
worker2 = env.process(worker(env, 'Worker 2', 3))
# 等待 worker1 完成
result = yield worker1
print(f'Coordinator received: {result}')
# 等待 worker2
result = yield worker2
print(f'Coordinator received: {result}')
env = simpy.Environment()
env.process(coordinator(env))
env.run()
### 事件 (Event)
可以手动触发的通用事件。
python
import simpy
def waiter(env, event):
print(f'Waiting for event at {env.now}')