2012-01-27 59 views
0

所以我有一個簡單的python cgi腳本。 Web前端用於添加東西到數據庫,並且我有update()函數可以進行一些清理。python web線程

我想在每次向網站添加內容時運行update()函數,但它需要位於後臺。也就是說,網頁應該在不等待update()函數完成的情況下完成加載。

現在我用:

-add stuff to db 
Thread(target=update).start() 
-redirect to index page 

這個問題似乎是Python並不想完成,直到更新()線程完成請求(重定向)。

任何想法?

+0

部署舉重量選項我們展示的代碼。 – Marcin 2012-01-27 12:28:50

+1

這可能超出了CGI的功能 - 您可能需要查看更高級的設置,如WSGI。 (雖然我可能是錯的) – 2012-01-27 13:16:42

回答

1

也就是說,網頁應完成加載無需等待update()函數來完成

CGI必須等待的過程中 - 作爲一個整體 - 來完成。線程沒有幫助。

你有三種選擇。

  1. subprocess。產生一個單獨的「不等待」子進程來執行更新。提供所有信息作爲命令行參數。

  2. multiprocessing。讓您的CGI連接在隊列中放置工作請求。你會開始一個單獨的偵聽器來處理來自Queue的更新請求。

  3. celery。下載Celery並使用它來管理進行後臺處理的獨立工作進程。

+0

謝謝,你能解釋如何實現選項1嗎? – breez 2012-01-27 15:21:05

+0

這似乎很清楚。 http://docs.python.org/library/subprocess.html#replacing-the-os-spawn-family關於子處理有許多堆棧溢出問題。你嘗試過「搜索」嗎?你有什麼特定**問題? – 2012-01-27 16:21:58

+0

子流程在Windows上不起作用。 – breez 2012-01-28 12:47:37

0
  • 你可以一個數據庫觸發器在響應更新數據庫添加到事件例如,如果一個特定的列已經改變
  • 例如啓動子,subprocess.Popen([sys.executable, '-c', "from m import update; update()"])。可能無法正常工作取決於你的CGI環境
  • 或剛剛接觸update文件由inotify腳本回升到一個單獨的進程
  • 開關運行必要的更新,以不同的執行環境,例如,一些多線程WSGI服務器
  • ,你可以使用celery如果它很容易在你的環境