У меня проблемы с чтением сообщений с двух серверов zmq (один установлен на REQ|REP
, а другой PUB|SUB
)
Два сервера работают на другом компьютере. Когда я читаю только соединение REQ|REP
, все работает отлично, но как только я пытаюсь прочитать соединение PUB|SUB
, программа зависает (я думаю, что оно всегда ждет сообщения)
from PyQt5 import QtCore, QtGui, QtWidgets
import zmq
import ui_mainwindow
class MainWindow(QtWidgets.QMainWindow, ui_mainwindow.Ui_MainWindow):
def __init__(self, parent = None):
super(MainWindow, self).__init__(parent)
self.context = zmq.Context()
try:
self.stateSocket = self.context.socket(zmq.REQ)
self.stateSocket.connect("tcp://134.105.89.197:5555")
except zmq.ZMQError as e:
print('States setup failed: ', e)
try:
self.context = zmq.Context()
self.anglesSocket = self.context.socket(zmq.SUB)
self.anglesSocket.connect("tcp://134.105.89.197:5556")
except zmq.ZMQError as e:
print('angles setup failed: ', e)
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.publishState)
self.timer.setInterval(500)
self.timer.start()
self.timer2 = QtCore.QTimer()
self.timer2.timeout.connect(self.publishAngles)
self.timer2.setInterval(500)
self.timer2.start()
# +more variables unrelated to problem
def publishState(self):
request= "a string"
try:
self.stateSocket.send_string(request)
self.reset = 0
message = self.stateSocket.recv()#flags=zmq.NOBLOCK)
values = [float(i) for i in message.decode("UTF-8").split(',')]
print("Status: ", message)
except zmq.ZMQError as e:
print('State communication: ', e)
values = [0] * 100
def publishAngles(self):
try:
message = anglesSocket.recv_string() # flags=zmq.NOBLOCK)
#values = [float(i) for i in message.decode("UTF-8").split(',')]
print("Angles: ", message)
except zmq.ZMQError as e:
print('Angles communication: ', e)
values = [0] * 100
edit: добавил полный соответствующий код. Что я наблюдаю, так это то, что тупик не исходит от REQ|REP
. Эта часть сама по себе прекрасно работает. Но похоже, что часть PUB|SUB
не работает в функции таймера. Когда я делаю минимальный пример с некоторое время l oop внутри publishAngels()
, это работает.
Так есть ли элегантный способ использования сокета PUB|SUB
в функции, связанной с Qt Timer?