Почему код, пытающийся прочитать сообщения из двух сокетов ZeroMQ, не работает? - PullRequest
0 голосов
/ 24 марта 2020

У меня проблемы с чтением сообщений с двух серверов 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?

1 Ответ

0 голосов
/ 24 марта 2020

В случае, если кто-то никогда не работал с ZeroMQ,
здесь можно получить удовольствие от первого взгляда на "Принципы ZeroMQ * менее чем за Пять секунд"
, прежде чем углубляться в детали



В:" Есть ли какая-то глупая ошибка, которую я упускаю из виду? "

Да, есть несколько и все легко уточняются.

1)
Пока еще неполная, видимая часть ZeroMQ демонстрирует принципиальную неопределенность в отношении того, какой тип подписки и другие. параметры безопасной защиты, если когда-либо, когда и где, применялись к SUB -socket-Archetype AccessPoint. То же самое относится к REQ -socket-Archetype AccessPoint, за исключением связанных с управлением подписками видов настроек по очевидным причинам.

2)
Код игнорирует документированные принципы известные правила для d istributed- F inite- S tate- A logis * domtaton (dFSA), встроенные в REQ/REP масштабируемый формальный архетип. Избегайте этого, используя правильный лог c, не нарушая, в данном случае обязательный, dFSA-шагер REQ-REP-REQ-REP-REQ-REP, плюс сделайте так, что обработка REQ и SUB станет взаимно независимой и у тебя есть это. Другими словами, наивные dFSA-правила, игнорирующие использование флага zmq.NOBLOCK, также не решают тупиковую ситуацию.


Если вы серьезно настроены стать профессионалом в области распределенных вычислений, необходимо прочитал сказочную книгу Питера Хинтьена "Код связан, том 1"

...