2009-07-25 50 views
3

我正在嘗試編寫一個應用程序,允許用戶啓動相當長時間的運行過程(5-30秒)。它應該允許用戶在生成過程時檢查過程的輸出。輸出將僅用於用戶當前的會話,因此不需要長期存儲任何內容。我有一個關於如何做到這一點的同時服用塔框架的優勢兩個問題:如何在Pylons中啓動後臺進程?

  1. 什麼是啓動一個後臺進程的最佳途徑,如這與主塔控制器?

  2. 什麼是獲得後臺輸出到用戶輸出的最佳方式? (我應該輸出存儲在數據庫中,在會話數據,等等?)

編輯: 的問題是,如果我在推出一個控制器使用subprocess命令,爲子控制器等待在繼續之前完成,向用戶顯示一個剛剛加載的空白頁面,直到該過程完成。我希望能夠在啓動子進程後立即將用戶重定向到狀態頁面,並允許它自行完成。

回答

6

我已經通過讓我調用的第二個進程守護進程來處理過去的這個問題(通過HTTP調用的長時間運行的進程)。你的Pylons控制器對你的第二個進程進行系統調用(傳遞任何需要的數據),第二個進程立即成爲一個守護進程。這會結束系統調用,您的控制器可以返回。

我的網絡應用程序通常會發出AJAX請求來「檢查」守護進程,直到它完成。我已經使用了兩個tmp文件(cPickle工作正常)和數據庫來共享守護進程和web-app之間的信息。

優秀蟒蛇守護配方:http://code.activestate.com/recipes/278731/

+0

我正在碰到這個問題。是安全的嗎?如果你每分鐘有10000個用戶呢?大部分請求都非常昂貴?那你會有很多守護進程在運行嗎?另外,你是否建議運行一個守護進程的進程?謝謝。 – User007 2012-07-22 12:42:52

1

我認爲這與掛架無關。我會做(在任何框架)在下列步驟操作:

  • 產生新作業一些ID,並在數據庫中添加一條記錄。
  • 創建一個新的過程,例如,通過子進程模塊,並通過命令行(*)傳遞ID。
  • 具有處理其輸出寫到/tmp/project/ID
  • 在外掛架,實現形式/job/ID/job?id=ID的網址。這將查看數據庫中作業是否完成,並將臨時輸出合併到頁面中。

(*)子進程可能會立即創建另一個進程,並讓pylons進程等待第一個子進程,這樣就不會有殭屍進程。

+0

預測的臨時文件名通常是不安全的 - 它們可以被濫用覆蓋到你的Web服務器有寫訪問任意文件。我會建議在/ var下使用預先創建的(具有適當的權限)目錄。 – 2009-09-17 19:13:04