我正在一个线程中创建一个 COM 客户端并使用该客户端执行多个操作。每个线程都是从使用 Python 模块的服务器产生的,该socketserver
模块具有内置的线程支持。
当我加载和使用这个 COM 对象时,python.exe 的内存使用量会出现预期峰值。对于 10 个并发线程,内存使用量峰值约为 500Mb。但是,当操作完成并且 COM 对象明显释放时,该进程使用的内存比以前增加了 50Mb。如果我随后使用同一台服务器生成 10 个额外的线程,那么在这些 COM 对象关闭后,python.exe 将额外使用 13Mb。最终,每 10 个额外的并发线程在完成后会增加大约 6Mb。当我结束整个 python.exe 进程时,所有内存都被释放。
我已经简化了以下代码来模仿 socketserver 的使用方式threadding
,问题是完全相同的。
import win32com.client
import threading
import pythoncom
def CreateTom():
pythoncom.CoInitialize()
tom = win32com.client.Dispatch("TOM.Document")
tom.Dataset.Load("FileName")
tom.Clear()
pythoncom.CoUninitialize()
for i in range(50):
t = threading.Thread(target = CreateTom)
t.daemon = False
t.start()
我知道我不太可能在特定的 COM 库(它是市场研究中使用的 IBM 产品,称为 TablesObjectModel)获得任何支持。但是,我想知道是否有任何事情,任何事情,我可以做些什么来释放这个记忆。我已经阅读了 COM 中的公寓,但听起来 pythoncom.CoInitialize 应该为我处理这个问题。任何帮助,将不胜感激。