PyQt + Redis-Py выключение висит - PullRequest
       29

PyQt + Redis-Py выключение висит

0 голосов
/ 05 октября 2019

Если я пытаюсь закрыть графический интерфейс из предоставленного кода, я получаю случайное зависание, которое происходит со мной, только когда у меня есть и 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_())
...