我在 Python 项目中使用包PyPubSub,因此我可以在程序运行时订阅通道的方法并在这些通道上发布。
作为压力测试的一部分,我将程序设置为反复运行多个小时。(每次运行大约需要 6 小时。)
前 20 小时似乎一切正常,但 20 小时后,我收到以下消息:“RuntimeError: BUG: Dead Listener call, still subscribed!”
据我所知,“死监听器”是一个已被垃圾收集的监听器(订阅频道的方法)。(PyPubSub 对每个通道的侦听器都有一个弱引用,但这些引用不足以防止侦听器被垃圾收集。)
这个错误不足以杀死我的整个程序,但足以断开我的服务器与客户端的 websocket 连接。(我使用Tornado实现了服务器。)
如果这是由于侦听器在没有正式取消订阅的情况下被垃圾收集造成的,那么这个问题会在运行一次而不是三四次后出现吗?我试图在每次运行结束时删除对侦听器的所有引用;我以为它们会被垃圾收集。
我应该尝试在每次运行结束时手动取消订阅侦听器吗?
如何防止发生此“死听者”错误?
编辑:我开始在每次运行结束时使用 pub.unsubscribe() 手动取消订阅侦听器,这似乎已经解决了问题。