一般,在Twisted中使用Application的方式启动程序,是这样做:
展开
复制代码
-
- pop_service = internet.TCPServer(…,…)
- popService = service.MultiService()
- pop_service.setServiceParent(popService)
- application= service.Application(‘popqueueservice’)
- popService.setServiceParent(application)
通过setServiceParent来把某一个服务运行在application中
如果程序中我们需要生成很多TCPClient对象,去做其它的很多事情,那么我们不能这么做:
展开
复制代码
-
- op_service = internet.TCPClient(popserver,popport,f)
- pop_service.setServiceParent(popService)
这样做是有很大问题的,因为每一个client的请求都被加入到了application中去运行
即使client执行完毕,也不会去释放自己对应的Factory实例和Protocol实例
长时间会造成内存中有很多这样的实例对象,内存不断增加,最后内存溢出…
这样的内存泄露,不太好定位,我之前检查了程序的各个地方,把能释放的资源都给释放了
唯独没有考虑到这个地方,最后使用了meliae工具,才定位到这个地方
然后这么修改的:
展开
复制代码
-
- pop_service.startService()
- f.deferred.addCallback(handleEnd,id,pop_service)
- 。。。。。。
- #在每个client执行完毕后的deffer中调用了
- s.stopService()
这样修改后,观察了几天,内存一直都比较稳定
转载于:https://www.cnblogs.com/zhangjing0502/archive/2012/05/24/2516415.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110402.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...