为了操作第三方设备,我使用python的win32com
模块与提供的UI进行交互。这通常可以正常工作,但很少(每10k调用一次)COM API会使用描述-2147024888
引发错误0x80070008
(not enough storage is available to process this command
)。这非常烦人,因为它通常在夜间杀死设备,并且运行程序需要完全重复。
现在的问题是, 实际上是内存不足,因为我肯定没有达到任何RAM限制。深入研究问题,我发现我也无法关闭并重新打开COM连接,因为这会导致错误-2147024882
(0x8007000e
)被描述为out of memory
。但是,this回答暗示实际上没有涉及内存问题。作为另一种解释,建议使用过多的句柄here。
观点支持这个想法,我现在不能再分叉线程了。在start()
上致电threading.Thread
我获得了
RuntimeError: can't start new thread
虽然根据threading.active_count()
只运行了4个线程。同时,从运行python的不同进程中没有观察到这些问题。因此,我怀疑我的流程耗尽了一些资源,但我不知道哪个。目前我看到了两个如何进行的选择。
选项1:找出我的流程耗尽的资源。但是,我不是真正的调试专家。我可以尝试做些什么,以便更好地了解幕后发生的事情?
选项2:解决问题并解决问题。在这种情况下,错误捕获似乎不够。一旦发生错误,似乎无法在不杀死python进程的情况下让所有内容再次运行。当然,这在python中是不可能的。
作为一种解决方案,我考虑过使用multiprocessing
模块并让所有与设备相关的调用在一个单独的进程中运行。如果出现问题,我会从我的主程序中删除进程并再次启动它,并可能继续发生错误。
对于这两个选项,我很乐意提供建议或指导。也许还有一些完全不同的东西,我没想过。任何帮助表示赞赏。
编辑:在Ben的评论的推动下,我查找了仍在运行的进程的一些属性,其中发生了错误。以下是我认为可能有用的数据列表: