我曾多次遇到同样的错误。我正在尝试查找/生成一个显示确切消息的示例。
在那之前,如果我没有记错的话,这些都是我关注的领域。
- 寻找在守护线程之外移除或关闭的端口、文件、队列等。
- 仔细检查守护线程中的阻塞调用。IE a
Queue.get(block=True)
, pyserial.read()
- 超时=无
在深入挖掘之后,我看到出现与 Queue 相关的相同类型的错误,请参见此处的评论。
我觉得奇怪的是它没有显示回溯。您可能会尝试注释掉 catch-all except 并让 Python 将其发送到 std.error。希望那时你将能够看到你正在死去的东西。
更新
我知道我以前见过这个问题......下面你会找到一个产生该错误的例子(实际上有很多)。请注意,也没有其他回溯消息...为了完整起见,在您看到错误消息后,取消注释这些queue.get
行并注释掉time.sleep
s。错误应该消失。 再次重新运行后,错误不再出现...这与您在零星故障率中看到的一致...您可能需要运行几次才能看到错误。
如果阻塞 IO,我通常使用time.sleep(x)
限制线程,例如get()
并且read()
不提供超时方法或没有阻塞调用要使用(例如用户界面刷新)。
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)