ZMQ中的Req/rep中断系统调用

2024-10-02 08:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在计算机(python)上使用zmq与使用zmq的机器人(c++)通信。 通信大部分时间都在工作,但在一段时间后(没有确切的时间点)会被interrupted system call错误中断

Python: 连接

self.context = zmq.Context()
self.stateSocket = self.context.socket(zmq.REQ)
self.failCounter = 0
self.poll = zmq.Poller()
try:
    self.stateSocket = self.context.socket(zmq.REQ)
    self.stateSocket.connect(self.connectString)
    self.poll.register(self.stateSocket, zmq.POLLIN)
    self.timer.start()
except zmq.ZMQError as e:
    print("Connection to socket not possible: ", e)
    

要在QTTimer中通信循环,请执行以下操作:

retries_left = 2
        while retries_left:
            request = #data here
            self.stateSocket.send_string(request, zmq.NOBLOCK)

            expect_reply = True
            while expect_reply:
                socks = dict(self.poll.poll(400))
                if socks.get(self.stateSocket) == zmq.POLLIN:
                    message = self.stateSocket.recv()
                    if not message:
                        break
                    expect_reply = False
                    retries_left = 0
                    self.receivedValues = [float(i) for i in message.decode("UTF-8").split(',')]

                    self.dataAnalysis() #do stuff with received values


                else:
                    print("W: No response from server, retrying ...")
                    # Socket is confused. Close and remove it.
                    self.stateSocket.setsockopt(zmq.LINGER, 0)
                    self.stateSocket.close()
                    self.poll.unregister(self.stateSocket)
                    retries_left -= 1
                    if retries_left == 0:
                        print("E: Server seems to be offline, abandoning")
                        break
                    else:
                        print("I: Reconnecting and resending ")
                        # Create new connection
                        self.stateSocket = self.context.socket(zmq.REQ)
                        self.stateSocket.connect(self.connectString)
                        self.poll.register(self.stateSocket, zmq.POLLIN)
                        self.stateSocket.send_string(request)

和cpp部分:

//setup
zmq::context_t context{ 1 };
zmq::socket_t socket{ context, ZMQ_REP };
const std::chrono::milliseconds timeout{ 400 };
zmq::pollitem_t pollItem[1];
zmq::message_t receivedData;
    try
    {
        int rc = zmq::poll(pollItem, 1, 400);
        if (rc < 0)
        {
            std::cout << "No data available" << std::endl;
        }
        else 
        {
            socket.recv(receivedData, zmq::recv_flags::dontwait);
        }

        zmq::message_t reply{ replyString.cbegin(), replyString.cend() };
        socket.send(reply, zmq::send_flags::dontwait);
    }
    catch (zmq::error_t& e)
    {
        std::cout << "Sending Error: " << e.what() << std::endl;
    }

这将运行30秒以上,然后cpp部件抛出一个Interrupted system call错误。从我所读到的内容来看,这意味着有东西阻塞了,但我不知道可能是什么问题。 有人知道我做错了什么吗


Tags: selfsendmessageifcontextsocketzmqreply

热门问题