面向?qū)ο蟮木幊獭狿ython應(yīng)用程序
Python應(yīng)用程序是可以支持面向過程的編程也支持面向?qū)ο蟮木幊?,在“面向過程”的語言中,程序是由過程或僅僅是可重用代碼的函數(shù)構(gòu)建起來的,希望本文能給大家?guī)韼椭?/P>
SimPy 庫只提供了三個抽象/父類,并且它們對應(yīng)于模擬的三個基本概念。有許多其它常規(guī)函數(shù)和常量用于控制模擬的運(yùn)行,但重要的概念都與這些類結(jié)合在一起。模擬中的核心概念是進(jìn)程。一個進(jìn)程只是一個對象,它完成某些任務(wù),隨后在它準(zhǔn)備完成下一個任務(wù)之
前有時會等待一會兒。在 SimPy 中,您還可以“鈍化”進(jìn)程,這意味著在一個進(jìn)程完成一個任務(wù)后,只有當(dāng)其它進(jìn)程要求該進(jìn)程完成其它任務(wù)時,它才會去做。把進(jìn)程當(dāng)作嘗試完成一個目標(biāo),常常是很有用的。在編寫進(jìn)程時,通常把它編寫成可以在其中執(zhí)行多個操作的循環(huán)。
在每個操作之間,可以插入 Python應(yīng)用程序語句,它讓模擬調(diào)度程序在返回控制之前執(zhí)行每個等待進(jìn)程的操作。進(jìn)程執(zhí)行的許多操作取決于資源的使用。資源只是在可用性方面受到限制。
在生物學(xué)模型中,資源可能是食物供應(yīng);在網(wǎng)絡(luò)模型中,資源可以是路由器或有限帶寬通道;在我們的市場模擬中,資源是付款通道。資源執(zhí)行的唯一任務(wù)是在任何給定的時間內(nèi)將它的使用限于一個特定的進(jìn)程上。
在 SimPy 編程模型下,進(jìn)程單獨(dú)決定它要保留資源的時間有多長,資源本身是被動的。在實際系統(tǒng)中,SimPy 模型可能適合概念性方案,也可能不適合;很容易想象到資源在本質(zhì)上會限制其利用率(例如,如果服務(wù)器計算機(jī)在必需的時間幀內(nèi)沒有獲得滿意的響應(yīng),則它會中斷連接)。
但作為編程問題,進(jìn)程或資源是否是“主動”方就不是特別重要(只要確保您理解了您的意圖)。***一個 SimPy 類是監(jiān)控程序。實際上監(jiān)控程序不是很重要,只不過它很方便。監(jiān)控程序所做的全部任務(wù)就是記錄向它報告的事件,并保存有關(guān)這些事件的統(tǒng)計信息(平均值、計數(shù)、方差等)。
該庫提供的Python應(yīng)用程序對記錄模擬措施是個有用的工具,但您也可以通過您想使用的其它任何技術(shù)來記錄事件。事實上,我的示例使 Monitor 子類化,以提供某些(稍微)增強(qiáng)的能力。
在我所撰寫的大部分文章中,我都會馬上給出樣本應(yīng)用程序,但在本例中,我認(rèn)為帶您經(jīng)歷食品雜貨店應(yīng)用程序的每個步驟會更有用。如果您愿意的話,可以把每個部分剪貼在一起;SimPy 創(chuàng)造者們將在將來的發(fā)行版中包含我的示例。
有些 SimPy 附帶的示例使用 import * 樣式。但我更喜歡使我填充的名稱空間更清晰。對于 Python應(yīng)用程序(SimPy 所需的***版本),將需要如指出的那樣,導(dǎo)入生成器特性。對于 Python 2.3 以后的版本,不需要這樣做。
對于我的應(yīng)用程序,我定義了幾個運(yùn)行時常量,它們描述了在特定的模擬運(yùn)行期間我感興趣的幾個方案。在我更改方案時,我必須在主腳本內(nèi)編輯這些常量。要是這個應(yīng)用程序的內(nèi)容更充實。
那么我就可能用命令行選項、環(huán)境變量或配置文件來配置這些參數(shù)。但就目前而言,這個樣式已經(jīng)足夠了:

我們的模擬需要完成的主要任務(wù)是定義一個或多個進(jìn)程。對于模擬食品雜貨店,我們感興趣的進(jìn)程是在通道處付款的顧客。
【編輯推薦】




























