防止PyPubSub“死侦听器”错误

时间:2016-04-14 02:03:40

标签: python garbage-collection tornado publish-subscribe pypubsub

我在Python项目中使用了包PyPubSub,因此我可以在程序运行时订阅通道的方法并在这些通道上发布。

作为压力测试的一部分,我将程序设置为反复运行多个小时。 (每次运行大约需要6个小时。)

前20个小时似乎一切正常,但是20个小时之后,我收到这样的消息:“RuntimeError:BUG:Dead Listener叫,仍然订阅!”

据我所知,“死侦听器”是一个被垃圾收集的侦听器(订阅频道的方法)。 (PyPubSub对每个通道的侦听器都有一个弱引用,但这些引用不足以阻止侦听器被垃圾回收。)

此错误不足以终止我的整个程序,但它足以断开我的服务器的websocket连接到客户端。 (我使用Tornado实现了服务器。)

如果这是因为听众被垃圾收集而没有被正式取消订阅,那么这个问题是在一次运行而不是三次或四次之后出现的吗?我尝试在每次运行结束时删除对侦听器的所有引用;我以为他们会被收集垃圾。

我应该尝试在每次运行结束时手动取消订阅听众吗?

如何防止此“死侦听器”错误发生?

编辑:我开始使用pub.unsubscribe()在每次运行结束时手动取消订阅侦听器,这似乎解决了问题。

1 个答案:

答案 0 :(得分:1)

我可以确认在线程化应用程序中使用PyPubSub时调用unsubscribe()可以解决此问题,如上方的第二条评论和问题末尾所示。

此外,在单元测试结束时调用unsubAll()还可以帮助您设置复杂的订阅〜将其放入tearDown()