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

时间:2018-03-01 18:43:37

标签: python sockets message-queue zeromq

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

现在,它仅适用于第一次发送/接收,而另一次尝试.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()

我连接正确吗?

为什么函数发送错误?

我将不胜感激任何帮助。谢谢。

2 个答案:

答案 0 :(得分:6)

仅仅因为 socketC (作为 REQ 原型的实例)无法发送另一条消息(如在实现中编码的那样)上面的 .send() 类方法,没有事先调用 socketC.recv() 实例方法。

REQ REP 原型都有良好的记录,必须遵守.send()-.recv()-.send()-.recv()-... resp的两步舞蹈。 .recv()-.send()-.recv()-...使用其原生实例方法。

这就是ZeroMQ REQ / REP套接字的设计和记录方式。

答案 1 :(得分:0)

如果您的消息传递是单向的,请考虑改为使用 ZMQ_PUSH / ZMQ_PULL 对。