Python实现事件驱动编程EDP, 2022-06-14

(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. 著,安道等译,中国工信出版社,人民邮电出版社

你可能感兴趣的:(Python实现事件驱动编程EDP, 2022-06-14)