Я использую следующий код для получения кадров от клиента:
def fetch_frame(self):
context = zmq.Context()
footage_socket = context.socket(zmq.REP)
footage_socket.bind('tcp://*:5555')
while True:
frame = footage_socket.recv_string()
frame = frame.encode()
img = base64.b64decode(frame)
npimg = np.fromstring(img, dtype=np.uint8)
source = cv2.imdecode(npimg, 1)
К сожалению, выдает следующую ошибку:
zmq.error.ZMQError: Operation cannot be accomplished in current state
Как правильно получить изображение с помощью zmq?
ОБНОВЛЯТЬ:
Ниже приведена трассировка:
File "/home/receive/main.py", line 77, in <module>
main()
File "/home/receive/main.py", line 73, in main
ci.fetch_frame()
File "/home/receive/main.py", line 59, in fetch_frame
frame = footage_socket.recv_string()
File "/home/.local/lib/python3.8/site-packages/zmq/sugar/socket.py", line 608, in recv_string
msg = self.recv(flags=flags)
File "zmq/backend/cython/socket.pyx", line 791, in zmq.backend.cython.socket.Socket.recv
File "zmq/backend/cython/socket.pyx", line 827, in zmq.backend.cython.socket.Socket.recv
File "zmq/backend/cython/socket.pyx", line 191, in zmq.backend.cython.socket._recv_copy
File "zmq/backend/cython/socket.pyx", line 186, in zmq.backend.cython.socket._recv_copy
File "zmq/backend/cython/checkrc.pxd", line 26, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Operation cannot be accomplished in current state
@martineau, пожалуйста, проверьте обновленный вопрос. я добавил логи
Да, именно такую информацию следует вкладывать в подобные вопросы, чтобы помочь другим понять, что не так.
Может ли проблема быть на другом конце?
Вопрос: "
ZMQError: Operation cannot be accomplished in current state
"
Основная причина в том, что ваш код нарушил задокументированные свойства ZeroMQ REQ/REP
.
Запрос REP
-экземпляра на .send()
-ed сообщение до того, как REQ
-экземпляр уже «запросил» своего контрагента первым, API должен выдать такую ошибку.
Точно так же, если вы пытаетесь .recv()
отправить сообщение на REQ
-стороне, до того, как оно впервые «спросит» .send()
REP
-сторону (чтобы ответить), API должен выдать такую ошибку.
В случае, если никакое другое взаимодействие не требуется, PUSH/PULL
Архетип масштабируемого шаблона формального общения, где PUSH
-сторона будет .send()
, а PULL
-сторона будет .recv()
, ИМХО, лучший путь вперед.
Вы можете прочитать больше советов и ссылок по этому поводу в этом.
Что выдает ошибку? Пожалуйста, отредактируйте свой вопрос и включите всю трассировку (или, как минимум, укажите, какая строка вашего кода ее вызывает).