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