防止PyPubSub“死听器”错误

问题描述 投票:1回答:1

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

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

[似乎一切在开始的20小时内都可以正常工作,但是在20小时后,我收到此消息:“ RuntimeError:BUG:调用了Dead Listener,仍然订阅了!”

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

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

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

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

如何避免发生“死听者”错误?

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

python garbage-collection tornado publish-subscribe pypubsub
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.