Если я пытаюсь закрыть графический интерфейс из предоставленного кода, я получаю случайное зависание, которое происходит со мной, только когда у меня есть и pyqt, и redis-py в одном и том же коде (только redis-py или pyqt не показывает толькопроблема).
Для воспроизведения просто запустите этот код. Обычно это занимает от 1 до 3 попыток.
Вы можете либо попытаться просто закрыть окно напрямую, либо вручную прекратить публикацию в redis pubsub, изменив выбранную запись в ComboBox (что обычно является моим выбором для более безопасного отключения, посколькуЯ не знаю, что такое redis-py).
Может кто-нибудь понять, почему у меня проблема? Я на Redis-Py версии 2.10.6 (и у меня нет прав, чтобы изменить это).
from PyQt5 import QtCore, QtWidgets
import sys
import redis
class red:
def __init__(self):
subscriptions = {"channel": self.receive}
self.redis = redis.Redis(host='localhost', port=6379, db=0, charset="utf-8", decode_responses=True)
self.pubsub = self.redis.pubsub()
self.pubsub.subscribe(**subscriptions)
self.pubsub_thread = self.pubsub.run_in_thread(sleep_time=0.1)
def end_it(self):
self.pubsub_thread.stop()
self.pubsub.close()
def receive(self, msg):
print("OK")
class MyWindow(QtWidgets.QWidget):
def __init__(self, *args):
super().__init__(*args)
box = QtWidgets.QComboBox()
box.addItems(['First', 'Second', 'Third'])
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(box)
self.setLayout(layout)
box.currentIndexChanged[int].connect(self.my_handler)
self.red = red()
@QtCore.pyqtSlot(int)
def my_handler(self, value):
print("Request to end")
self.red.end_it()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())