代码之家  ›  专栏  ›  技术社区  ›  Denyk

ZeroMQ操作抛出EXC:[当前状态下无法完成操作]

  •  7
  • Denyk  · 技术社区  · 6 年前

    我正在尝试创建一个能够发送数据然后接收数据的类。

    目前,它只在第一次发送/接收时起作用,另一次尝试 .send() 它将在下面抛出一个错误。

    >Traceback (most recent call last):
      File "main.py", line 31, in <module>
        zq.send(arr)
      File "D:\ITIM\video2\MQCompare\cZMQ.py", line 17, in send
        self.socketC.send(data)
      File "zmq/backend/cython/socket.pyx", line 636, in zmq.backend.cython.socket.S
    ocket.send (zmq\backend\cython\socket.c:7305)
      File "zmq/backend/cython/socket.pyx", line 683, in zmq.backend.cython.socket.S
    ocket.send (zmq\backend\cython\socket.c:7048)
      File "zmq/backend/cython/socket.pyx", line 206, in zmq.backend.cython.socket._
    send_copy (zmq\backend\cython\socket.c:3032)
      File "zmq/backend/cython/socket.pyx", line 201, in zmq.backend.cython.socket._
    send_copy (zmq\backend\cython\socket.c:2920)
      File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc.
    _check_rc (zmq\backend\cython\socket.c:10014)
        raise ZMQError(errno)
    zmq.error.ZMQError: Operation cannot be accomplished in current state`
    

    我使用的代码如下所示:

    import zmq
    
    class ZeroMQ:
    
    def __init__(self):
        self.context = zmq.Context()
        self.socketS = self.context.socket(zmq.REP)
        self.socketS.bind("tcp://*:5555")
        self.socketC = self.context.socket(zmq.REQ)
        self.socketC.connect("tcp://localhost:5555")
    
    def __exit__(self, exc_type, exc_value, traceback):
        self.socketC.close()
        self.socketS.close()
    
    def send(self, data):
        self.socketC.send(data)
    
    def recv(self):    
        self.socketS.recv()
    

    我连接对了吗?

    为什么函数send会引发错误?

    我会感激你的帮助。非常感谢。

    2 回复  |  直到 6 年前
        1
  •  17
  •   user3666197    6 年前

    只是因为 socketC ,是 REQ archetype,无法再发送另一条消息(正如在 .send() 类方法),而无需事先调用 socketC.recv() 实例方法。

    二者都 要求 REP 原型有很好的记录,必须遵守 .send()-.recv()-.send()-.recv()-... 响应。 .recv()-.send()-.recv()-... 使用其本机实例方法。

    这就是ZeroMQ REQ / REP 设计并记录插座。

        2
  •  0
  •   Oleg Kokorin    3 年前

    如果您的消息是单向的,请考虑使用 ZMQ\U推/ZMQ\U拉 而是配对。