2009-10-24 105 views
14

我需要運行一個可能需要幾個小時才能從Django視圖完成的進程。我不需要知道狀態或與之通信,但是我需要這個視圖在啓動過程後立即重定向。如何從Django視圖開始長時間運行的進程?

我試過使用subprocess.Popen,在新的threading.Thread,multiprocessing.Process內使用它。但是,父進程會一直掛起,直到孩子終止。 差不多完成的唯一方法是使用分叉。很明顯,這並不好,因爲它會在父母終止之前留下殭屍程序。

這就是我試圖用叉子時要做到:

if os.fork() == 0: 
    subprocess.Popen(["/usr/bin/python", script_path, "-v"]) 
else: 
    return HttpResponseRedirect(reverse('view_to_redirect')) 

那麼,有沒有一種方法,以最小的傷亡Django視圖運行一個完全獨立的進程?或者我做錯了什麼?

+2

重複:http://stackoverflow.com/search?q=%5Bpython%5D+long-running。 http://stackoverflow.com/questions/1107826/python-long-running-daemon-job-processor,http://stackoverflow.com/questions/805120/python-task-server – 2009-10-25 11:54:13

回答

10

我不知道這是否適合您的情況,但這裏是我做的:我使用任務隊列(通過django模型);當視圖被調用時,它會在任務中輸入新記錄並愉快地重定向。反過來,cron定期執行任務,獨立於django。

編輯:cron調用相關(和自定義)django命令來執行任務。

5

首先 - 儘量爲你使用cron任務,早說shanyu。

如果它不適合你 - 那麼嘗試使用CeleryProject,用於Django任務隊列。爲了工作,它使用RabbitMQ。這裏有一點overview簡單的使用基期貨

相關問題