2013-07-26 60 views
2

我的堆棧是Nginx + Flup + Flask。如何在請求使用nginx/flup重新啓動後運行後臺線程?

所以我有一個有限的線程運行具有有限生命週期的後臺線程。

t = threading.Thread(target=campaign.run, args=(campaign_obj,)) 
t.setDaemon(False) 
t.start() 

它被執行,持續大約一分鐘或2分鐘,然後結束。事情是,爲了響應,我已經在後臺進程仍在運行時首先向請求返回一個值。

問題是,在某種程度上,fcgi線程不斷死亡。

我曾試圖改變connection_timeout到1800年

keepalive_timeout 1800s; 

nginx的重新啓動,現在它被幾乎立即的線程響應後切斷。

我怎樣才能既

1)簡單的解決我的Python代碼/ fcgi的代碼(不重構與Redis的/ RabbitMQ的一個巨大的新的堆棧/芹菜,因爲這實在是一個快速項目)

2)停止nginx殺死我的線程,至少不會那麼快。

謝謝!

+0

使用子流程。 – snf

+0

子進程或多進程? – nubela

+0

對不起,我的意思是多處理:http://docs.python.org/2/library/multiprocessing.html#the-process-class。 – snf

回答

0

使用多處理

只要你返回一個值,並完成請求,FastCGI的是會照顧你清理,這意味着你催生了線程。如果您確實需要繼續執行任務,則必須使用多重處理,以便您生成的過程可以在請求結束時存活。

否則,芹菜真的很容易設置,並解決這個問題,你有...

+0

我不認爲子進程工作,除非我寫另一個獨立的腳本。我同意芹菜。但我認爲正確的答案實際上是多進程 – nubela

+0

子進程通過分叉你當前的進程工作。 (AFAIK) – Thomas

+0

你是對的,我混淆了兩者。多處理是你需要的。 – Thomas

相關問題