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