Python 终止挂起的redis pubsub.listen()线程

Python 终止挂起的redis pubsub.listen()线程,python,multithreading,python-2.7,redis,redis-py,Python,Multithreading,Python 2.7,Redis,Redis Py,与此相关,我有以下代码订阅redis pubsub队列,并使用_init___中提供的处理程序将消息提供给处理它们的类: from threading import Thread import msgpack class Subscriber(Thread): def __init__(self, redis_connection, channel_name, handler): super(Subscriber, self).__init__(name="Recei

与此相关,我有以下代码订阅redis pubsub队列,并使用_init___中提供的处理程序将消息提供给处理它们的类:

from threading import Thread
import msgpack

class Subscriber(Thread):

    def __init__(self, redis_connection, channel_name, handler):
        super(Subscriber, self).__init__(name="Receiver")
        self.connection = redis_connection
        self.pubsub = self.connection.pubsub()
        self.channel_name = channel_name
        self.handler = handler
        self.should_die = False

    def start(self):
        self.pubsub.subscribe(self.channel_name)
        super(Subscriber, self).start()

    def run(self):
        for msg in  self.pubsub.listen():
            if self.should_die:
                return
            try:
                data = msg["data"]
                unpacked = msgpack.unpackb(data)
            except TypeError:
                # stop non-msgpacked, invalid, messages breaking stuff
                # other validation happens in handler
                continue
            self.handler(unpacked)

    def die(self):
        self.should_die = True
在上面的链接问题中,需要注意的是,如果断开连接,
pubsub.listen()
将永远不会返回。因此,我的
die()
函数虽然可以调用,但实际上永远不会导致线程终止,因为它挂起在线程的
run()
内对
listen()
的调用

关于链接问题的公认答案提到入侵redis py的连接池。我真的不想做这件事,也不想有一个分叉版本的redis py(至少在修复被希望接受到master中之前),但我已经看过redis py代码,并没有立即看到这一更改将在哪里进行

有人知道如何干净地解决悬而未决的redis py
listen()
调用吗


直接使用
Thread.\u Thread\u stop

这么多年后,我会遇到什么问题。它最终成为redis库中的一个bug。我调试了它并提交了测试结果。这不应该再发生了