我在Python项目中使用了包PyPubSub,因此我可以在程序运行时订阅通道的方法并在这些通道上发布。
作为压力测试的一部分,我将程序设置为反复运行多个小时。 (每次运行大约需要6个小时。)
前20个小时似乎一切正常,但是20个小时之后,我收到这样的消息:“RuntimeError:BUG:Dead Listener叫,仍然订阅!”
据我所知,“死侦听器”是一个被垃圾收集的侦听器(订阅频道的方法)。 (PyPubSub对每个通道的侦听器都有一个弱引用,但这些引用不足以阻止侦听器被垃圾回收。)
此错误不足以终止我的整个程序,但它足以断开我的服务器的websocket连接到客户端。 (我使用Tornado实现了服务器。)
如果这是因为听众被垃圾收集而没有被正式取消订阅,那么这个问题是在一次运行而不是三次或四次之后出现的吗?我尝试在每次运行结束时删除对侦听器的所有引用;我以为他们会被收集垃圾。
我应该尝试在每次运行结束时手动取消订阅听众吗?
如何防止此“死侦听器”错误发生?
编辑:我开始使用pub.unsubscribe()在每次运行结束时手动取消订阅侦听器,这似乎解决了问题。答案 0 :(得分:1)
我可以确认在线程化应用程序中使用PyPubSub时调用unsubscribe()可以解决此问题,如上方的第二条评论和问题末尾所示。
此外,在单元测试结束时调用unsubAll()还可以帮助您设置复杂的订阅〜将其放入tearDown()