如何使用ZeroMQ PUB / SUB发送由ndarray和None组成的Python字典?

问题描述

我正在尝试使用ZeroMQ传递3张图像(存储为ndarray)的python字典,以将其作为使用者传递给另一个程序并将数据解析回原始形式。遵循三种方式,但是任何一种方式都无法取得成功。

下面是最小复制代码示例:

import pickle
import zmq

# Adding ZMQ Context
def zmq_context():
    # Creating ZMQ context starts
    context = zmq.Context()
    footage_socket = context.socket(zmq.PUB)
    footage_socket.connect('tcp://localhost:5002')
    return footage_socket
    
wagon_dtl,ctr1_dtl,ctr2_dtl = ndarrays of images
socket_ctx = zmq_context()

# Trying two different ways of formatting the image before creating the dict,the below approach works for all three ndarrays

# 1st way
wagon_dtl = image_np_save # image_np_save is the original image

# 2nd way (this I tried because an ndarray isn't JSON serializable)
encoded,buffer = cv2.imencode('.jpg',image_np_save)
wagon_dtl = base64.b64encode(buffer)
            

if cond == "fulfilled":
    full_wgn_dict = {"wagon_dtl": wagon_dtl,"ctr1_dtl": ctr1_dtl,"ctr2_dtl": ctr2_dtl}
    
    # 1st way
    dict_as_b64text = base64.b64encode(full_wgn_dict)
    socket_ctx.send(dict_as_b64text)
    
    # 2nd way
    myjson = json.dumps(full_wgn_dict)
    socket_ctx.send(myjson)
    
    # 3rd way
    dict_as_text = pickle.dumps(full_wgn_dict).encode('base64','strict')
    socket_ctx.send(dict_as_text)

如何解决这个问题?

在研究此解决方案时,我一直遵循以下问答:12345

解决方法

Q “如何使用ZeroMQ ndarray发送由NonePUB/SUB组成的Python字典?” >

容易,最好使用现成的.send_pyobj()方法来完成此操作。


发送方
PUB 应该对socket.send_pyobj( full_wgn_dict )方法进行调用,基本上就在这方面。


接收方,
每个潜在的 SUB -s都应重用.recv_pyobj()方法。

所有SUB-都还必须执行一个步骤,以主动订阅以接收所有消息。

有关socket.setsockopt( zmq.SUBSCRIBE,"" )的详细信息,请参见ZeroMQ记录的API,或者不要犹豫从许多示例here中饮。


一些其他技巧(琐碎的dict-s不需要)可能有助于SER / DES阶段的pickle阶段。然而,这些超出了本课题的范围,可能会在受控环境中带来优势,但在开放,不受控制的环境中会带来问题,在这些环境中,您几乎没有机会满足要求的先决条件-在我的应用中,我更喜欢使用{{1} }具有更高的对象import dill as pickle-SER / DES处理鲁棒性和许多高级功能,例如存储全会话快照。积分归@MikeMcKearns

随时重新阅读pickle.dumps()字符串中所有与语法有关的详细信息的文档:

__doc__