2013-02-04 51 views
1

所以我使用subprocess通過使用Django的Web界面產生長時間運行的進程。現在,如果用戶想回到頁面,我想給他在稍後階段終止subprocess的選項。使用全局單例實例將子進程對象存儲在內存中

這怎麼辦?我在Java中實現了相同的功能,並創建了一個全局單例ProcessManager字典來將過程對象存儲在內存中。我可以在Python中做類似的事嗎?

編輯

是單身和ProcessManager的的哈希值是乾淨做它的方式。 Emmanuel的代碼通過一些修改可以很好地工作。

感謝

回答

1

我認爲在Python中實現Singleton模式的簡單方法是通過類屬性:

from my_module import ProcessManager 

my_args = ... 
ProcessManager.set_process(my_args) 

... 

ProcessManager.kill_process() 

注:

import subprocess 

class ProcessManager(object): 
    __PROCESS = None; 

    @staticmethod 
    def set_process(args): 
     # Sets singleton process 
     if __PROCESS is None: 
      p = subprocess.Popen(args) 
      ProcessManager.__PROCESS = p; 
     # else: exception handling 

    @staticmethod 
    def kill_process(): 
     # Kills process 
     if __PROCESS is None: 
      # exception handling 
     else: 
      ProcessManager.__PROCESS.kill() 

然後你可以通過使用這個類

  • t他ProcessManager負責創建過程中,要對稱,其截至
  • 我沒有在多線程足夠的知識,知道這部作品在多線程模式
+0

但是,這使得它只能將一個進程一次連接到進程管理器,用於多個進程?頂部的另一層散列? – redDragonzz

+1

噢,如果你有幾個進程,那麼使用相同類型的設計,你可以很容易地使用key = session ID的'dict'(或者任何需要識別會話的方式),value = process。測試一個會話ID有一個已經註冊的進程仍然很簡單('if process_id in __PROCESS_DICT' ...) – Emmanuel

+0

是否有效:) – redDragonzz

1

可以使用Python中的技術與Java中的技術相同,即將對流程的引用存儲在模塊變量中或實現一種單例。

與Java相比,您唯一的問題是Python沒有像Servlet規範那樣豐富的類比,並且沒有接口來處理應用程序的開始或結束。在大多數情況下,您不應該擔心應用程序有多少實例正在運行,因爲您從持久存儲中獲取所有數據。但在這種情況下,您應該瞭解您的應用程序的部署方式。

如果應用程序有一個長時間運行的實例(例如FastCGI實例或cherrypy上的單個WSGI應用程序),則可以將流程處理功能隔離在單獨的模塊中,並在模塊處於加載狀態導入(任何模塊在應用程序中只導入一次)。如果有很多實例(許多FastCGI實例或普通的CGI腳本),則應該更好地分離子進程並將它們的ID保存在一個持久存儲中(在數據庫或文件中),並將它們與當前正在運行的進程列表一經請求。

+0

我想知道芹菜是怎麼做到的。它完全用Python編寫,即使他們理解他們的流程處理技術中的15%也是如此。但我明白單身的部分。我覺得可以做嘗試使用@靈光的代碼爲出發點。謝謝 ! – redDragonzz