2016-09-18 97 views
3

如果在運行時懷疑python線程之間存在死鎖,有什麼方法可以解決它而不會終止整個過程?如何實時解決線程死鎖?

例如,如果少數線程比他們應該花費的時間更長,資源管理器可能會懷疑其中一些線程已經死鎖。當然,它應該在未來的代碼中進行調試,有沒有一種乾淨的解決方案可以立即使用(在運行時),可能會殺死特定的線程以便其他人可以恢復?

編輯:我正在考慮添加一些睡眠檢測循環(在它自己的線程中)睡一會兒,然後檢查所有正在運行的線程,如果其中一些看起來很慢,它會殺死最不重要的其中之一。在什麼時候線程被懷疑是死鎖,哪個線程最不重要,當然是由死鎖檢測循環程序員定義的。

顯然,它不會捕獲所有問題(最明顯的是,如果死鎖檢測線程本身已死鎖)。這個想法並不是找到一個數學上完美的解決方案(當然,這不是編寫死鎖的代碼)。相反,我想在一些現實案例中部分解決問題。

+1

編寫無法死鎖的代碼。 – Fredrik

+0

@Fredrik當然,我完全同意。但是在一個由多人編寫的大型代碼庫中很難快速實現這一點,而這些代碼有時會被懷疑陷入僵局。隨着時間的推移將讀取/修復/重新設計代碼與一些可能改善應用程序行爲的立即自動死鎖解決方案結合起來可能是值得的。 – max

+0

如果說主線程死鎖,你的策略是什麼? – Natecat

回答

2

您可能會提前嘗試使用this代碼片段,但在執行過程中,程序停滯不前,您無法對此做很多事情。

像WinDbg或strace這樣的調試器可能會有所幫助,但是由於Python是一種解釋型語言,我懷疑它們會被現實使用。

+0

這是真棒,比我預期的更好,只要檢測。但是可以通過殺死他們來做任何事情來「阻止」線程「死鎖」嗎? – max

+0

@max您可以通過使用未記錄的外部API調用來終止線程。 **它有很高的機會讓記憶變成「Kaboom」並腐蝕整個堆棧**。請參見[this](http://stackoverflow.com/a/323993/1658617)。你可以直接在你的代碼和'exec()'中寫'2/0'。會更安全。 – Bharel

+0

根據這個鏈接,它似乎不會破壞堆棧,它只會在堆上留下一堆無法收集的垃圾。更大的問題是殺死一個線程不會自動釋放它所持有的鎖(不管是GIL還是鎖定通過python'threading' API獲取的單個資源)。因此,殺死線程的全部點在我的情況下被擊敗。 – max