我有一个服务器子类产生线程响应处理程序,处理程序依次启动应用程序线程。一切都很顺利,除非我使用ObjGraph我看到正在运行的应用程序线程的正确数量(我正在进行负载测试并阻止了35个应用程序实例的运行)。Python多线程应用程序与特定于线程的记录器实例的内存泄漏
调用objgraph.typestats()提供了每个对象当前在解释器中生存多少个实例的细分(根据GC)。查看内存泄漏的输出,我发现700个记录器实例 - 这将是服务器产生的响应处理器的总数。
我已经调用logger.removehandler(memoryhandler)和logger.removehandler(filehandler),当应用程序线程退出run()方法以确保没有对记录器实例的延迟引用时,记录器实例也完全隔离在应用程序线程内(没有外部引用)。作为消除这些记录器实例的最后一步,run()中的最后一条语句是del self.logger
要在init()中获取记录器,我提供一个适当大的随机数来命名它,文件访问 - 我使用相同的大数字作为日志文件名的一部分,以避免应用程序日志冲突。
长和短是我有700个跟踪GC的记录器实例,但只有35个活动线程 - 我该如何去关闭这些记录器?一个更麻烦的工程师解决方案是创建一个记录器池,并在应用程序线程的生命周期中获取一个,但是当GC应该自动处理时,创建更多的代码来维护。