Python实现事件驱动编程EDP, 2022-06-14
2022-06-13 本文已影响0人
Mc杰夫
(2022.06.14 Tues)
这是一个出租车队的运营仿真。每个车的行车时间随机。每辆车有多个动作,在不同的时间点。最先在系统里面运行的是时间值最小的动作。采用优先队列/heap来实现执行出租车动作的动作。
class Simulator:
def __init__(self, procs_map):
self.events = queue.PriorityQueue()
self.procs = dict(procs_map)
def run(self, end_time): ➊
"""排定并显示事件,直到时间结束"""
# 排定各辆出租车的第一个事件
for _, proc in sorted(self.procs.items()): ➋
first_event = next(proc) ➌
self.events.put(first_event) ➍
# 这个仿真系统的主循环
sim_time = 0 ➎
while sim_time < end_time: ➏
if self.events.empty(): ➐
print('*** end of events ***')
break
current_event = self.events.get() ➑
sim_time, proc_id, previous_action = current_event ➒
print('taxi:', proc_id, proc_id * ' ', current_event) ➓
active_proc = self.procs[proc_id] ⓫
next_time = sim_time + compute_duration(previous_action) ⓬
try:
next_event = active_proc.send(next_time) ⓭
except StopIteration:
del self.procs[proc_id] ⓮
else:
self.events.put(next_event) ⓯
else: ⓰
msg = '*** end of simulation time: {} events pending ***'
print(msg.format(self.events.qsize()))
Reference
1 流畅的Python,Luciano R. 著,安道等译,中国工信出版社,人民邮电出版社