2009-09-16 53 views
0

我在運行Django,並且創建了在Django運行時並行運行的線程。那些線程有時會運行外部進程,在等待外部輸入時阻塞。當Django重新啓動時,終止子線程?

當我重新啓動Django時,那些在等待外部輸入時阻塞的線程有時會在重新啓動時持續存在,並且它們還會繼續打開端口8080,因此Django無法重新啓動。

如果我知道Django何時重新啓動,我可以殺死這些線程。我怎麼知道Django何時重新啓動,以便我可以殺死這些線程(及其產生的)。

從django.utils.autoreload中不明顯,其中任何鉤子可能會告訴重新啓動何時發生。

Django啓動時是否有另一種殺死這些線程的方法?

感謝您的閱讀。

Brian

回答

1

這是不容易的Python進程殺死自己的線程 - 就更難了(幾乎不可能)殺另一進程中的線程,我懷疑後者是你的情況下......將「重啓「大概是在不同的過程中發生的,所以這些線程或多或少超出了你的界限!

我的建議反而是「在時間防微杜漸」:當您創建這些線程,一定要設置其daemon屬性True(見the docs - 這是在Python < = 2.5 setDaemon方法)。這樣,當主線完成時,例如要在另一個進程中重新啓動,整個進程(也應該自動將所有守護進程線程自動關閉!) - 也會如此 - -

+0

謝謝亞歷克斯。自此我決定爲此啓動一個全新的非Django守護進程,因爲它解決了一整套複雜性問題。我恐怕已經失去了嘗試你的建議的能力,但我會聽取你的意見並將其標記爲答案。 ;) – 2009-09-16 04:11:01

0

你用什麼來重新啓動django?我會在該腳本中放入一些東西來查找套接字文件中的進程ID,並在啓動django之前殺掉它們。

或者,您可能會非常沉重並且在您的django啓動序列之前運行諸如'pkill -9 * django *'之類的東西。

相關問題