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