2009-10-21 17 views
1

我正在使用掛鉤和粘貼來編寫web應用程序。在完成HTTP請求(發送一些電子郵件,向db寫入一些內容等)之後,我有一些工作我不想阻止HTTP請求。在python粘貼中啓動自己的線程

如果我啓動一個線程來完成這項工作,那好嗎?我總是看到有關粘貼殺死線程的東西等等。它會殺死我正在工作的線程嗎?

我還能在這裏做什麼?有沒有一種方法可以讓請求返回,但在完成之後運行一些代碼?

謝謝。

+0

你在哪裏看到'粘貼殺死線程'? – Mark

+0

18:59:29,042 INFO [paste.httpserver.ThreadPool] kill_hung_threads狀態:10個線程(0個工作,10個空閒,0個啓動)大時間不適用,最大時間0.00sec,殺死0個工作人員 – zak23

回答

0

你可以使用線程方法(也許設置Thead.daemon屬性會有所幫助 - 但我不確定)。

但是,我會建議尋找一個任務排隊系統。您可以將任務放在隊列中(非常快),然後偵聽器可以異步處理任務,從而使HTTP請求可以快速返回。有兩個任務隊列,我知道Django的:

你也可以考慮使用更多的「企業」的消息解決方案,如RabbitMQActiveMQ

編輯previous answer有一些很好的指針。

+1

芹菜不僅僅適用於Django有些人已經使用它與主塔。 – asksol

0

我認爲最好的解決方案是消息傳遞系統,因爲如果塔架進程停止,它可以配置爲不會鬆動任務。尤其是在這種情況下,我總是使用線程進程。如果您使用python 2.6+,請使用內置的multiprocessing,或者您始終可以安裝可在pypi上找到的處理模塊(因爲我是新用戶,所以無法發佈鏈接)。

0

看看齒輪人員,它是專門爲「工作人員」處理任務而開發的。他們甚至可以用完全不同的語言處理它。你可以回來問問任務是否完成,或者讓它完成。這對許多任務應該很好。

如果你絕對需要確保它已經完成,我建議在數據庫或持久性的地方排隊任務,然後有一個獨立的進程貫穿它,確保每個進程得到適當的處理。

0

要直接回答您的基本問題,您應該能夠按照自己的意願使用線索。 「殺死掛鉤」部分是粘貼清理自己的線程,而不是你自己的線程。

還有其他軟件包可能有幫助等,但我建議你從簡單的線程開始,看看你得到多遠。只有這樣你才能知道你下一步需要什麼。 (注意,「Thread.daemon」在這裏大多不適用於你,設置true將確保你啓動的線程不會阻止整個進程退出,但是這樣做意味着如果進程退出「乾淨地」(而不是被迫退出),即使它沒有完成它的工作,你的線程也會被終止。無論這是一個問題,以及如何處理這樣的事情,完全取決於你自己的需求和設計。