2013-12-16 53 views
1

我有一個單元測試,在幾個不同的線程中做了一堆東西。當我在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連接在某種程度上仍在等待這個過程。也許快速的互斥體也在等待着。

是否有反正我可以進一步縮小搜索範圍?

回答

1

如果您在Linux下工作,那麼您應該可以使用'ps -eLf'來獲取所有活動進程和線程的列表。假設你在創建時給你的線程一個好名字,應該很容易看到還在運行的東西。

我相信,windows下你可以得到一個工具,做同樣的事情 - 看http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

注:我沒有使用過Windows的工具,這一點我自己

而且從內部Python中,你可以使用psutil包(https://pypi.python.org/pypi/psutil/)得到類似的infomration

+0

謝謝!這有助於幫助我:)使用ps和一些其他參數(例如-p爲確切的過程),我發現wchan(等待或睡覺某事)值爲4個線程。據我瞭解,他們似乎是一般的等待和futex_wait_queue_me。儘管如此,我還是無法將它們鏈接到線程名稱。 –

+1

如果您在腳本末尾使用threading.enumerate()(在拆卸方法),您應該能夠獲得所有仍在運行的線程的列表。如果他們被命名,那麼你應該能夠識別哪些仍在運行。您可以通過將name =「name」參數傳遞給您用來創建它的threadable.thread對象的構造函數來命名一個線程。 – Tommy

+0

感謝你我很快就發現我在殺死子進程後仍然處於打開狀態的問題。問題解決了:) –