我认为这将是那些简单的问题之一,但它让我感到困惑。
[停止媒体:我是对的。找到了解决方案。查看答案。]
我正在使用 Python 的单元测试框架来测试多线程应用程序。很好而且很直接 - 我有 5 个左右的工作线程监视一个公共队列,以及一个为它们制作工作项的生产者线程。生产者线程由测试用例触发。
在此测试中,只有一个任务被放入队列中。它在测试中所做的处理只是真正处理的存根,因此工作线程会进行 5 秒的睡眠来模拟任务真正完成之前经过的时间,并且线程将准备好获取另一个任务。
代码片段是:
logging.info("Sleep starting")
time.sleep(5)
logging.info("Waking up")
现在是奇怪的部分。我看到“睡眠开始”日志消息,但没有看到唤醒消息。程序锁定并且不响应键盘中断 (CTRL+C)。 CPU负载非常低。
我在 Windows 和 Ubuntu (Python 2.6.2) 中看到同样的问题。
我考虑过是否发生异常并被隐藏,因此我在第一行和第二行之间添加“print 1/0” - 我看到引发了除零错误。我把它移到睡眠后,但我从未看到该消息。
我想“好吧,也许另一个线程正在尝试同时记录非常非常大的东西,并且它仍在缓冲。它在做什么?”
好吧,此时,测试已返回到单元测试,在测试系统状态之前,它会暂停等待线程开始运行。
logging.info("Test sleep starting")
time.sleep(0.25)
logging.info("Test waking up")
哇,这看起来很熟悉。它以完全相同的方式冻结!第一条日志消息出现,第二条则没有。
我最近对该单元进行了重大重写,因此我不能声称“我没有碰任何东西”,但我在我的更改中看不到任何不愉快的地方。
可疑区域:
什么会阻止线程唤醒?我还错过了什么?