我有一個單元測試,在幾個不同的線程中做了一堆東西。當我在tearDown方法中停止所有事情時,不知何故仍在運行。我跑步的意思是睡覺。我在python進程(Ubuntu 12.04)上運行了最高命令,它告訴我這個進程正在休眠。找到睡眠蟒蛇進程的原因
現在我已經嘗試使用pdb來找出發生了什麼,例如,通過在tearDown末尾放置set_trace()。但那沒有告訴我什麼。我懷疑這是因爲一些其他線程已經開始較早睡眠,因此此時不再訪問。
有什麼工具或方法可以用來追蹤我的不停車過程的原因嗎?
編輯
使用ps -Tp <#Process> -o wchan
我現在知道,4個線程仍在運行,這三對unix_stream_data_wait等待futex_wait_queue_me和一個。由於我之前有一個子進程,我用os.kill(pid, signal.SIGKILL)
殺死了,我懷疑Pipe連接在某種程度上仍在等待這個過程。也許快速的互斥體也在等待着。
是否有反正我可以進一步縮小搜索範圍?
謝謝!這有助於幫助我:)使用ps和一些其他參數(例如-p爲確切的過程),我發現wchan(等待或睡覺某事)值爲4個線程。據我瞭解,他們似乎是一般的等待和futex_wait_queue_me。儘管如此,我還是無法將它們鏈接到線程名稱。 –
如果您在腳本末尾使用threading.enumerate()(在拆卸方法),您應該能夠獲得所有仍在運行的線程的列表。如果他們被命名,那麼你應該能夠識別哪些仍在運行。您可以通過將name =「name」參數傳遞給您用來創建它的threadable.thread對象的構造函數來命名一個線程。 – Tommy
感謝你我很快就發現我在殺死子進程後仍然處於打開狀態的問題。問題解決了:) –