这里我们使用"事件"来控制流程,流程的发生不再人为地指定,而是通过事件来控制
设想这样一个场景:
开黑的时候一边挂着游戏(比如农药),一边偷摸学习
- 当正在匹配队友的时候,可以偷摸学习
- 当匹配上队友要开打的时候,就要专心打游戏了
- 游戏打完要匹配队友的时候,还能偷摸学习,如此往复
import simpy
class MatchPlayersScene(object):
def __init__(self, env: simpy.Environment, game=10):
self.env = env
self.game = game
self.matching = env.event()
self.matching.succeed() # 初始的时候正在匹配,因此激活这个事件
self.game_begin = env.event()
# 这里初始化所有流程
env.process(self.learning())
env.process(self.gaming())
def learning(self): # 学习的流程
while self.game:
yield self.matching
self.matching = self.env.event() # 这里相当于是重置这个触发器
print('开始学习哈,学习10s', self.env.now)
yield self.env.timeout(10)
print('哎呀匹配好了,要开打了', self.env.now)
self.game_begin.succeed()
def gaming(self): # 打游戏的流程
while self.game:
yield self.game_begin # 开始打游戏
self.game_begin = self.env.event()
print('可以打游戏了,要打20s', self.env.now)
yield self.env.timeout(20)
print("打完游戏了", self.env.now)
print("还可以再玩 ", str(self.game), '把游戏')
print('------____________---------')
self.matching.succeed()
self.game -= 1
if __name__ == '__main__':
key_env = simpy.Environment()
scene = MatchPlayersScene(key_env)
key_env.run()