我有兩個線程(生產者和消費者),我與Queue
共享數據。問題是,當我強行中止生產者時,消費者有時會鎖定。Python線程死鎖
我在文檔中看到用隊列取消線程可能會破壞隊列並導致死鎖。我沒有明確獲取任何鎖,但是閱讀Queue.py的源文件時說put
和get
正在這樣做。
請問,有誰知道它可能是這樣的情況,當我中止線程時,它可能在get
/put
的中間,即使用鎖定然後不釋放它?我能做些什麼呢?我有時需要過早地終止生產者。將使用進程,而不是線程,有什麼區別?
我有兩個線程(生產者和消費者),我與Queue
共享數據。問題是,當我強行中止生產者時,消費者有時會鎖定。Python線程死鎖
我在文檔中看到用隊列取消線程可能會破壞隊列並導致死鎖。我沒有明確獲取任何鎖,但是閱讀Queue.py的源文件時說put
和get
正在這樣做。
請問,有誰知道它可能是這樣的情況,當我中止線程時,它可能在get
/put
的中間,即使用鎖定然後不釋放它?我能做些什麼呢?我有時需要過早地終止生產者。將使用進程,而不是線程,有什麼區別?
很可能你的死鎖是由於沒有完成線程。如果你有linux下可以使用注射器從pyrasite打印回溯(你會知道你的程序掛在那裏)
如果您正在使用的任何鎖在信號處理程序 - 那麼很可能這是你的僵局 (這是一個有點複雜,請詢問是否需要說明)
創建進程而不是線程肯定會改變情況,但請記住任何數據交換和同步都非常複雜。
如何「完成」一個線程?我認爲,當run()達到結束時就完成了。我自己也不使用任何信號處理程序,也許Queue.py呢? http://hg.python.org/cpython/file/2.7/Lib/Queue.py –
是的,如果run()到達結束然後它結束(對於優雅的主線程應該做「join()」) - >你可以添加調試信息,以確保你的線程(生產者/建築師)結束,因爲它可能掛在queue.get()或
你如何中止線程?按Ctrl + C? –
像這樣:http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python –
你可以發佈一些代碼,所以我們可以知道發生了什麼? – betabandido