首页 > 编程问答 >Python 的 time.sleep - 永远不会醒来

Python 的 time.sleep - 永远不会醒来

时间:2024-07-22 08:12:51浏览次数:17  
标签:python multithreading deadlock sleep

我认为这将是那些简单的问题之一,但它让我感到困惑。

[ 停止媒体:我是对的。找到了解决方案。查看答案。 ]

我正在使用 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")

哇,这看起来很熟悉。它以完全相同的方式冻结!第一条日志消息出现,第二条没有出现。

我最近对单元进行了重大重写,所以我不能声称“我没有碰任何东西”,但我在其中看不到任何异常。我的更改。

可疑区域:

  • 我包括使用 Threading.Lock (因为我不知道如何推理 GIL 的安全性,所以我坚持我所知道的。我认为我的代码没有任何“死锁” .

  • 我是 Python 的单元测试框架的新手,它是否可以通过重定向日志记录或类似的方式来模拟这些症状?

  • 不,我还没有替换非标准时间模块!

会发生什么?阻止线程醒来?我还错过了什么?


已解决: 问题出在我的单元测试中。我有一个在测试方法执行后运行的“tearDown”方法。它加入了工作线程,超时为 1 秒(以防出现问题)。

事实证明,从线程内部加入线程是行不通的 - 整个测试运行都停止了,直到线程完成(此时它永远不会完成,因为它正在等待自己完成)。

感谢所有提出建议的人。我接受了在单独的进程中运行工作代码的建议,这让我找到了问题所在。

标签:python,multithreading,deadlock,sleep
From: 2342397

相关文章

  • python中使用mitmproxy的http模块出错
    我有一个使用mitmproxyhttp函数的代码,它在这里惨败:defmain(stdscr):try:parser=argparse.ArgumentParser(description='NetSourNetworkAnalyzer')parser.add_argument('--proxy',action='store_true',help='EnableH......
  • 使用python图像去噪没有获得所需的重建图像
    我是python机器学习的初学者,我正在编写一个程序,使图像变得嘈杂,然后我的程序输出重建的图像。我正在使用加性高斯白噪声并使用前馈神经网络。我的程序显示真实图像、噪声图像和重建图像。这些是我通常得到的结果。有人知道如何解决这样的问题吗?这是我的代码:ap......
  • 使用 pip 22.3.1 和 python 3.11.0 安装 MetaTrader5 错误
    我正在尝试使用pip在Windows上安装MetaTrader5。python--versionPython3.11.0pip--versionpip22.3.1pipinstallMetaTrader5ERROR:CouldnotfindaversionthatsatisfiestherequirementMetaTrader5(fromversions:none)ERROR:Nomatchingdistribu......
  • 在 Python 中溶解线条
    我有一个包含多行的形状文件。我正在寻找一种方法来消除所有的接触线。这在ArcMap中是可能的,但似乎在Python和QGIS中都无法做到:之前:所需的输出:这需要在多行上完成,因此像QGIS合并一样手动执行不是一个选项。在ArcMap中,我曾经使用“溶解”......
  • 一个简单的问题(python、串行通信和arduinos)
    只是一个关于小脚本的快速问题,由于某种原因无法工作我运行了这个脚本:importserialimporttimeimportturtledefserialreading():serialPort=serial.Serial(port="COM5",baudrate=9600,bytesize=8,timeout=2,stopbits=serial.STOPBITS_ONE......
  • 我在 Windows 10 上运行 Python 代码后控制台立​​即关闭
    虽然我在代码末尾使用input(),但在Windows10(IDLE之外)的窗口中输入名称后,控制台仍然立即关闭,并且我看不到结果。我该怎么做才能阻止控制台关闭?#!python3name=input('Enteryourname:')print('Hello'+name)input('pressEntertoexit:')你在代码末尾......
  • 具有未定义嵌套列表深度的嵌套列表的Python注释类型
    [[1,2,3],3,[2,4],5]的类型是list[list[int]|int]但是,如果嵌套列表具有未定义的深度,例如[[[1,2]],2,[1,[3,[3]]]],3,[2,[2]]],那么它会具有什么类型?可以使用递归类型提示来表示任意深度嵌套的列表:fromtypingimportList,Union......
  • 在Spyder(Python 3.6)中导入cv2时出现导入错误
    我已经在Windows操作系统中安装了opencv3.0.0。我已运行该应用程序并已成功将其安装在C:\驱动器中,并且还将cv2.pyd文件复制到C:\Python27\Lib\site-packages中,正如我在几个教程视频中看到的那样在我的Python2.7.5Shell中,即当我键入>>>i......
  • Python + VS Code 调试器:可视化我的程序当前正在执行的源代码中的位置?
    当我使用VSCodePython调试器时:我可以执行我的程序,以便编辑器将我逐行带到源代码中的任何位置(跳转到相关文件/如果尚未打开则将其打开)目前的执行情况是?是的,VSCode的Python调试器可以让你逐行执行代码,并实时显示当前执行的位置。以下是操作方法:1.设置断点:......
  • 如何立即取消使用 Ollama Python 库生成答案的 Asyncio 任务?
    我正在使用Ollama通过OllamaPythonAPI从大型语言模型(LLM)生成答案。我想通过单击停止按钮取消响应生成。问题在于,只有当响应生成已经开始打印时,任务取消才会起作用。如果任务仍在处理并准备打印,则取消不起作用,并且无论如何都会打印响应。更具体地说,即使单击按钮后,此函数......