我在Python项目中使用了PyPubSub包,这样我就可以在程序运行时将方法订阅到通道并在这些通道上发布。
作为压力测试的一部分,我将程序设置为反复运行数小时。(每次运行大约需要6个小时。)
在最初的20小时内,一切似乎都很正常,但在20小时后,我收到了这样的消息:"RuntimeError: BUG: Dead Listener called,still!“
据我所知,"Dead Listener“是一个已经被垃圾回收的侦听器(订阅通道的方法)。(PyPubSub对每个通道的侦听器有一个弱引用,但这些引用不足以防止侦听器被垃圾收集。)
这个错误不足以杀死我的整个程序,但它足以断开我的服务器与客户端的websocket连接。(我使用Tornado实现了服务器。)
如果这是由于侦听器在没有正式取消订阅的情况下被垃圾收集引起的,那么这个问题会在运行一次而不是三到四次之后出现吗?我尝试在每次运行结束时删除对侦听器的所有引用;我以为它们会被垃圾收集。
我应该尝试在每次运行结束时手动取消订阅监听程序吗?
如何防止这个"Dead Listener“错误发生?
编辑:我开始使用pub.unsubscribe()在每次运行结束时手动取消订阅侦听器,这似乎已经解决了这个问题。
发布于 2020-04-13 04:26:47
我可以确认,在线程化应用程序中使用PyPubSub时调用unsubscribe()可以修复这个问题,如上面的第二个注释所示&在问题的末尾。
此外,在单元测试结束时调用unsubAll()也可以帮助您设置复杂的订阅~将其放在tearDown()
https://stackoverflow.com/questions/36612576
复制相似问题