我也遇到過,有幾次同樣的錯誤。我試圖找到/生成顯示確切消息的示例。
在此之前,如果我的記憶能爲我服務,那麼這些就是我關注的領域。
- 尋找端口,文件,隊列等...在守護進程線程之外被移除或關閉。
- 檢查守護進程線程中的阻塞調用。 IE瀏覽器
Queue.get(block=True)
,pyserial.read()
- 與超時=無
挖多一點我看到相同類型的錯誤彈出有關隊列的see comments here後。
我覺得很奇怪,它沒有顯示回溯。您可以嘗試將註釋全部註釋掉,並讓Python將其發送到std.error。希望你能看到你身上的死亡。
更新
我知道我已經看到這個問題之前......下面,你會發現,產生錯誤(其中許多人實際上)的例子。請注意,沒有其他追溯消息...爲了完整起見,在看到錯誤消息後,取消註釋queue.get
行並註釋掉time.sleep
。錯誤應該消失。 再次重新運行此操作後,錯誤不會顯示出來......這與您在零星故障率中看到的內容一致...您可能需要運行幾次以查看錯誤。
我通常使用time.sleep(x)
如果阻塞IO如get()
和read()
不提供超時方法OR沒有被使用(用戶界面刷新例如)阻塞調用節流線程。
這就是說,我相信有一個線程在等待time.sleep()
調用時被關閉的問題。我相信這個電話是我每次都得到的,但我不知道sleep
方法中究竟是什麼導致了這個問題。據我所知,還有其他阻塞調用顯示相同的行爲。
import time
import Queue
from threading import Thread
SLAVE_CNT = 50
OWNER_CNT = 10
MASTER_CNT = 2
class ThreadHungry(object):
def __init__(self):
self.rx_queue = Queue.Queue()
def start(self):
print "Adding Masters..."
for x in range(MASTER_CNT):
self.owners = []
print "Starting slave owners..."
for y in range(OWNER_CNT):
owner = Thread(target=self.__owner_action)
owner.daemon = True
owner.start()
self.owners.append(owner)
def __owner_action(self):
self.slaves = []
print "\tStarting slaves..."
for x in range(SLAVE_CNT):
slave = Thread(target=self.__slave_action)
slave.daemon = True
slave.start()
self.slaves.append(slave)
while(1):
time.sleep(1)
#self.rx_queue.get(block=True)
def __slave_action(self):
while(1):
time.sleep(1)
#self.rx_queue.get(block=True)
if __name__ == "__main__":
c = ThreadHungry()
c.start()
# Stop the threads abruptly after 5 seconds
time.sleep(5)
哦:這可能是有關個人興趣(http://stackoverflow.com/questions/8456395/threaded-importing-while-interpreter-shuts-down) – Oddthinking
劃痕,去年的想法。我的導入在線程啓動之前完成。 – Oddthinking
可能相關:http://bugs.python.org/issue4106 https://github.com/paramiko/paramiko/issues/17 http://stackoverflow.com/questions/1745232/solving-thread-cleanup-on- paramiko – Patashu