摘要:仿真示例出租車進程。每次狀態變化時向仿真程序產出一個事件結束出租車進程出租車仿真程序主程序。
這個簡單的例子讓我們比較淺顯易懂的看到了事件驅動型框架的運作方式,即在單個線程中使用一個主循環驅動協程執行并發活動。
使用協程做面向事件編程時,協程會不斷的把控制權讓步給主循環,激活并向前運行其他協程,從而執行各個并發活動。這是一種協作多任務:協程顯示的把控制權讓步給中央調度程序。
仿真示例
import random import collections import queue import argparse import time DEFAULT_NUMBER_OF_TAXIS = 3 DEFAULT_END_TIME = 180 SEARCH_DURATION = 5 TRIP_DURATION = 20 DEPARTURE_INTERVAL = 5 Event = collections.namedtuple("Event", "time proc action") #出租車進程。 def taxi_process(ident, trips, start_time=0): """每次狀態變化時向仿真程序產出一個事件""" time = yield Event(start_time, ident, "leave garage") for i in range(trips): time = yield Event(time, ident, "pick up passenger") time = yield Event(time, ident, "drop off passenger") yield Event(time, ident, "going home") #結束出租車進程 #出租車仿真程序主程序。 class Simulator: def __init__(self, procs_map): self.events = queue.PriorityQueue() #優先級隊列,put方法放入數據,一般是一個數組(3, someting),get()方法數值小的優先出隊 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) #所有車的第一個事件放到優先隊列中,time小的優先出來 #此次仿真的主循環 sim_time = 0 while sim_time < end_time: if self.events.empty(): print("***事件結束***") break current_event = self.events.get() #取出time最小的事件 sim_time, proc_id, previous_action = current_event #元組解包 print("taxi:", proc_id, proc_id * " ", current_event) active_proc = self.procs[proc_id] #取出當前事件對象。是一個子生成器對象,下面要對這個對象send(time)來獲得下一個yield的返回值 next_time = sim_time + comput_duration(previous_action) #隨機計算下一個時間 try: next_event = active_proc.send(next_time) #下一個事件是子生成器執行到下一個yield的返回值 except StopIteration: #StopIteration異常說明當前子生成器執行完畢,從字典中刪除它 del self.procs[proc_id] else: self.events.put(next_event) #否則就把下一個事件放入優先隊列中 else: #如果while循環沒有以break結束,那么輸出結束信息 msg = "*** 仿真結束。{}個車沒有回家 ***" print(msg.format(self.events.qsize())) #仿真結束 def comput_duration(previous_action): """使用指數分布計算操作的耗時""" if previous_action in ["leave garage", "drop off passenger"]: interval = SEARCH_DURATION elif previous_action == "pick up passenger": #新狀態是行程開始 interval = TRIP_DURATION elif previous_action == "going home": interval = 1 else: raise ValueError("未知的活動:{}".format(previous_action)) return int(random.expovariate(1/interval) + 1) def main(end_time=DEFAULT_END_TIME, num_taxis=DEFAULT_NUMBER_OF_TAXIS, seed=None): #構建隨機生成器,構建過程,運行仿真程序 if seed is not None: random.seed(seed) #指定seed的值時,用這個seed可以使隨機數隨機出來的相等 taxis = {i: taxi_process(i, (i+1*2), i*DEPARTURE_INTERVAL) for i in range(num_taxis)} #字典生成式,生成指定數量的子生成器對象 sim = Simulator(taxis) #實例化仿真主循環 sim.run(end_time) #run it! if __name__ == "__main__": parser = argparse.ArgumentParser(description="出租車運行仿真") #創建參數解析對象,添加描述 parser.add_argument("-e", "--end_time", type=int, default=DEFAULT_END_TIME) #添加-e參數,默認值為180 parser.add_argument("-t", "--taxis", type=int, default=DEFAULT_NUMBER_OF_TAXIS, help="出租車出行數量, default=%s" %DEFAULT_NUMBE R_OF_TAXIS) #添加-t參數,用來指定出租車數量,默認值為3 parser.add_argument("-s", "--seed", type=int, default=None, help="隨機生成seed") #添加-s參數,用來設置seed值,如果seed值一樣那 么隨機出來的結果也會一樣,默認值為None args = parser.parse_args() #這個函數用來獲取參數 main(args.end_time, args.taxis, args.seed) #通過上面函數的屬性的到輸入的參數,屬性可以是雙橫線后的字符串也可以是添加參數函數的第一個不加橫線的字符串
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43773.html
摘要:徘徊和行程所用的時間使用指數分布生成,我們將時間設為分鐘數,以便顯示清楚。迭代表示各輛出租車的進程在各輛出租車上調用函數,預激協程。 前兩篇我們已經介紹了python 協程的使用和yield from 的原理,這一篇,我們用一個例子來揭示如何使用協程在單線程中管理并發活動。。 什么是離散事件仿真 Wiki上的定義是: 離散事件仿真將系統隨時間的變化抽象成一系列的離散時間點上的事件,通過...
摘要:年來,途靈智能無人車實驗室一直致力于研發級全自動駕駛系統。目前,同濟大學途靈智能無人車實驗室正在攻克的課題就是提高級自動駕駛技術突破環境局限的能力,這種突破需要將駕駛腦放置在仿真模擬場景下進行大量的極限訓練。車水馬龍的道路上,各種車輛交錯匯聚,各種道路狀況頻出。從行駛緩慢的環衛車到疾駛搶道的出租車、因施工臨時封閉的道路、突發的交通事故現場。作為路面上的車輛,是互不相讓,還是借道通過,又或者是...
摘要:近日,華為宣布推出業界最高性能處理器鯤鵬,以及基于鯤鵬的服務器。彈性云服務器靈活彈性,性能領先倍華為云將推出基于的彈性云服務器,相較于業界同類規格云服務器性能領先倍。近日,華為宣布推出業界最高性能ARM-based處理器-鯤鵬920(Kunpeng 920),以及基于鯤鵬 920 的TaiShan服務器。TaiShan服務器目前已經率先應用在華為云上,以服務的形式提供彈性云服務器、裸金屬服務...
本文關鍵為大家分享了python大數據可視化pygal仿真模擬搖篩子完成實例,感興趣的小伙伴可以參考借鑒一下,希望可以有一定的幫助,祝愿大家多多的不斷進步,盡早漲薪 數據可視化包Pygal形成可放大矢量圖格式文檔 還可以在規格不同類型的屏上全自動放大,表明數據圖表 #安裝pygal pipinstallpygal ''' 想要了解Pygal可生成什么樣...
閱讀 2703·2021-11-25 09:43
閱讀 2084·2021-11-24 09:39
閱讀 1952·2021-11-17 09:33
閱讀 2749·2021-09-27 14:11
閱讀 1838·2019-08-30 15:54
閱讀 3223·2019-08-26 18:27
閱讀 1263·2019-08-23 18:00
閱讀 1810·2019-08-23 17:53