[ PROMPT_NODE_27420 ]
process-interaction
[ SKILL_DOCUMENTATION ]
# SimPy 流程交互
本指南涵盖了 SimPy 模拟中流程交互和同步的机制。
## 交互机制概述
SimPy 提供了三种主要的流程交互方式:
1. **基于事件的钝化/激活** - 用于信号传递的共享事件
2. **等待流程终止** - Yield 流程对象
3. **中断** - 强制恢复暂停的流程
## 1. 基于事件的钝化与激活
流程可以共享事件来协调它们的执行。
### 基本信号模式
python
import simpy
def controller(env, signal_event):
print(f'Controller: Preparing at {env.now}')
yield env.timeout(5)
print(f'Controller: Sending signal at {env.now}')
signal_event.succeed()
def worker(env, signal_event):
print(f'Worker: Waiting for signal at {env.now}')
yield signal_event
print(f'Worker: Received signal, starting work at {env.now}')
yield env.timeout(3)
print(f'Worker: Work complete at {env.now}')
env = simpy.Environment()
signal = env.event()
env.process(controller(env, signal))
env.process(worker(env, signal))
env.run()
**用例:**
- 协调操作的启动信号
- 完成通知
- 广播状态变更
### 多重等待者
多个流程可以等待同一个信号事件。
python
import simpy
def broadcaster(env, signal):
yield env.timeout(5)
print(f'Broadcasting signal at {env.now}')
signal.succeed(value='Go!')
def listener(env, name, signal):
print(f'{name}: Waiting at {env.now}')
msg = yield signal
print(f'{name}: Received "{msg}" at {env.now}')
yield env.timeout(2)
print(f'{name}: Done at {env.now}')
env = simpy.Environment()
broadcast_signal = env.event()
env.process(broadcaster(env, broadcast_signal))
for i in range(3):
env.process(listener(env, f'Listener {i+1}', broadcast_signal))
env.run()
### 屏障同步 (Barrier Synchronization)
python
import simpy
class Barrier:
def __init__(self, env, n):
self.env = env
self.n = n
self.count = 0
self.event = env.event()
def wait(self):
self.count += 1
if self.count >= self.n:
self.event.succeed()
return self.event
def worker(env, barrier, name, work_time):
print(f'{name}: Working at {env.now}')
yield env.timeout(work_time)
print(f'{name}: Reached barrier at {env.now}')
yield barrier.wait()
print(f'{name}: Passed barrier at