2011-12-29 68 views
7

我需要在控制器方法內調用的web2py應用程序中異步處理大型(耗時且耗費內存的)進程。使用web2py異步後臺進程

我的具體用例是通過stdlib.subprocess調用一個進程,並等待它退出而不阻塞網絡服務器,但我接受其他方法。

  • 動手的例子是一個加號。
  • 歡迎第三方圖書館推薦 。
  • CRON調度不是必需/想要的。

回答

7

假設你需要啓動後臺任務的多個可能同時的,情況下,解決方案是一個任務隊列。如果您正在尋找第三方選項,我已經聽說過關於Celery和RabbitMQ的好消息,並且web2py包含了可能足以滿足您的需求的it's own task queue系統。

使用任何一種工具,您都可以定義一個函數來封裝您希望後臺進程執行的操作。然後使任務隊列工作人員聯機。 web2py手冊和論壇指出,這可以通過web2py cron系統中的@reboot語句完成,每當Web服務器啓動時都會觸發該語句。如果情況不理想,可能還有其他方法來啓動員工。

在你的控制器,你將插入一個任務到任務隊列,傳遞任何必要的參數作爲函數的輸入(後臺功能不會在相同的環境中運行控制,所以不會有機會獲得會話,數據庫等,除非您明確地將適當的值傳遞給任務函數)。

現在,獲取後臺操作的輸出給用戶。當您將任務插入任務隊列時,您應該獲取該任務的唯一ID。然後,您將實現控制器邏輯(要麼是AJAX調用,要麼是保持刷新直到任務完成的頁面),調用任務隊列的API來檢查指定任務的狀態。如果任務狀態爲「已完成」,則將數據返回給用戶。如果沒有,請繼續等待。

+0

我覺得內置的任務調度只是我一直在尋找。 – 2011-12-30 00:29:17

1

這比人們所預料的更加困難。請注意0​​中的死鎖警告。如果你不介意阻塞,使用Popen.communicate很容易。要解決阻塞問題,可以使用stdlib.subprocess從線程管理進程。

我最喜歡的方式來處理子過程是使用Twisted's spawnProcess。但是,讓Twisted與其他框架很好地搭配並不容易。