Hướng dẫn zmq send python object - zmq gửi đối tượng python

Hỏi: "Làm thế nào để gửi một từ điển Python bao gồm ndarrayNone bằng cách sử dụng Zeromq PUB/SUB?" : "How to send a Python dictionary consisting of ndarray and None using ZeroMQ PUB/SUB?"

Dễ dàng, người ta có thể sử dụng tốt nhất tốt nhất ____ ____ ____ 6 phương pháp để thực hiện đúng điều này.


Phía gửi, PUB sẽ thực hiện cuộc gọi đến ____ 8 phương pháp, và về cơ bản là tất cả ở bên này.
the PUB shall be doing a call to the socket.send_pyobj( full_wgn_dict )-method, and that's basically all on this side.


Một bên nhận, mỗi bên tiềm năng ____ 9-S sẽ tái sử dụng ____ 10 phương pháp.
each of the potential SUB-s shall reuse the

import zlib, cPickle as pickle

def send_zipped_pickle(socket, obj, flags=0, protocol=-1):
    """pickle an object, and zip the pickle before sending it"""
    p = pickle.dumps(obj, protocol)
    z = zlib.compress(p)
    return socket.send(z, flags=flags)

def recv_zipped_pickle(socket, flags=0, protocol=-1):
    """inverse of send_zipped_pickle"""
    z = socket.recv(flags)
    p = zlib.decompress(z)
    return pickle.loads(p)
0-method.

Tuy nhiên, tất cả các ____ 9-S cũng phải thực hiện thêm một bước, để chủ động đăng ký để nhận bất kỳ tin nhắn nào.

Để biết chi tiết về

import zlib, cPickle as pickle

def send_zipped_pickle(socket, obj, flags=0, protocol=-1):
    """pickle an object, and zip the pickle before sending it"""
    p = pickle.dumps(obj, protocol)
    z = zlib.compress(p)
    return socket.send(z, flags=flags)

def recv_zipped_pickle(socket, flags=0, protocol=-1):
    """inverse of send_zipped_pickle"""
    z = socket.recv(flags)
    p = zlib.decompress(z)
    return pickle.loads(p)
2, hãy xem API được ghi lại Zeromq hoặc không ngần ngại nhâm nhi từ nhiều ví dụ ở đây.


Một số thủ thuật bổ sung (không cần thiết cho tầm thường ____ 13-s) có thể giúp với giai đoạn ____ 14 của giai đoạn Ser/Des. Tuy nhiên, những điều này vượt xa phạm vi của câu hỏi này và có thể đưa ra những lợi thế trong môi trường được kiểm soát nhưng các vấn đề trong môi trường mở, không kiểm soát Sự mạnh mẽ cao hơn của việc xử lý các đối tượng ____ 16-ser/des và nhiều tiến bộ hơn, như lưu trữ ảnh chụp nhanh toàn cảnh. Tín dụng truy cập @Mikemckearns

Vui lòng đọc lại tài liệu có mặt cho tất cả các chi tiết liên quan đến cú pháp trong chuỗi

import zlib, cPickle as pickle

def send_zipped_pickle(socket, obj, flags=0, protocol=-1):
    """pickle an object, and zip the pickle before sending it"""
    p = pickle.dumps(obj, protocol)
    z = zlib.compress(p)
    return socket.send(z, flags=flags)

def recv_zipped_pickle(socket, flags=0, protocol=-1):
    """inverse of send_zipped_pickle"""
    z = socket.recv(flags)
    p = zlib.decompress(z)
    return pickle.loads(p)
7:

>>> print zmq.Socket.send_pyobj.__doc__
Send a Python object as a message using pickle to serialize.

        Parameters
        ----------
        obj : Python object
            The Python object to send.
        flags : int
            Any valid flags for :func:`Socket.send`.
        protocol : int
            The pickle protocol number to use. The default is pickle.DEFAULT_PROTOCOL
            where defined, and pickle.HIGHEST_PROTOCOL elsewhere.
        
>>> print zmq.Socket.recv_pyobj.__doc__
Receive a Python object as a message using pickle to serialize.

        Parameters
        ----------
        flags : int
            Any valid flags for :func:`Socket.recv`.

        Returns
        -------
        obj : Python object
            The Python object that arrives as a message.

        Raises
        ------
        ZMQError
            for any of the reasons :func:`~Socket.recv` might fail

Khi gửi tin nhắn qua mạng, bạn thường cần sắp xếp dữ liệu của mình vào byte.

Xây dựng tuần tự hóa tích hợp

PYZMQ chủ yếu là các ràng buộc cho libzmq, nhưng chúng tôi cung cấp ba phương pháp tuần tự hóa xây dựng để thuận tiện, để giúp các nhà phát triển Python tìm hiểu libzmq. Python có hai gói chính để tuần tự hóa các đối tượng:

import zlib, cPickle as pickle

def send_zipped_pickle(socket, obj, flags=0, protocol=-1):
    """pickle an object, and zip the pickle before sending it"""
    p = pickle.dumps(obj, protocol)
    z = zlib.compress(p)
    return socket.send(z, flags=flags)

def recv_zipped_pickle(socket, flags=0, protocol=-1):
    """inverse of send_zipped_pickle"""
    z = socket.recv(flags)
    p = zlib.decompress(z)
    return pickle.loads(p)
8 và
import zlib, cPickle as pickle

def send_zipped_pickle(socket, obj, flags=0, protocol=-1):
    """pickle an object, and zip the pickle before sending it"""
    p = pickle.dumps(obj, protocol)
    z = zlib.compress(p)
    return socket.send(z, flags=flags)

def recv_zipped_pickle(socket, flags=0, protocol=-1):
    """inverse of send_zipped_pickle"""
    z = socket.recv(flags)
    p = zlib.decompress(z)
    return pickle.loads(p)
9, vì vậy chúng tôi cung cấp các phương thức tiện lợi đơn giản để gửi và nhận các đối tượng được tuần tự hóa với các mô -đun này. Một ổ cắm có các phương thức
import numpy

def send_array(socket, A, flags=0, copy=True, track=False):
    """send a numpy array with metadata"""
    md = dict(
        dtype = str(A.dtype),
        shape = A.shape,
    )
    socket.send_json(md, flags|zmq.SNDMORE)
    return socket.send(A, flags, copy=copy, track=track)

def recv_array(socket, flags=0, copy=True, track=False):
    """recv a numpy array"""
    md = socket.recv_json(flags=flags)
    msg = socket.recv(flags=flags, copy=copy, track=track)
    buf = buffer(msg)
    A = numpy.frombuffer(buf, dtype=md['dtype'])
    return A.reshape(md['shape'])
0 và
import numpy

def send_array(socket, A, flags=0, copy=True, track=False):
    """send a numpy array with metadata"""
    md = dict(
        dtype = str(A.dtype),
        shape = A.shape,
    )
    socket.send_json(md, flags|zmq.SNDMORE)
    return socket.send(A, flags, copy=copy, track=track)

def recv_array(socket, flags=0, copy=True, track=False):
    """recv a numpy array"""
    md = socket.recv_json(flags=flags)
    msg = socket.recv(flags=flags, copy=copy, track=track)
    buf = buffer(msg)
    A = numpy.frombuffer(buf, dtype=md['dtype'])
    return A.reshape(md['shape'])
1, tương ứng với việc gửi một đối tượng qua dây sau khi tuần tự hóa với JSON và Pickle tương ứng, và bất kỳ đối tượng nào được gửi qua các phương thức đó đều có thể được xây dựng lại bằng các phương thức
import numpy

def send_array(socket, A, flags=0, copy=True, track=False):
    """send a numpy array with metadata"""
    md = dict(
        dtype = str(A.dtype),
        shape = A.shape,
    )
    socket.send_json(md, flags|zmq.SNDMORE)
    return socket.send(A, flags, copy=copy, track=track)

def recv_array(socket, flags=0, copy=True, track=False):
    """recv a numpy array"""
    md = socket.recv_json(flags=flags)
    msg = socket.recv(flags=flags, copy=copy, track=track)
    buf = buffer(msg)
    A = numpy.frombuffer(buf, dtype=md['dtype'])
    return A.reshape(md['shape'])
2 và
import numpy

def send_array(socket, A, flags=0, copy=True, track=False):
    """send a numpy array with metadata"""
    md = dict(
        dtype = str(A.dtype),
        shape = A.shape,
    )
    socket.send_json(md, flags|zmq.SNDMORE)
    return socket.send(A, flags, copy=copy, track=track)

def recv_array(socket, flags=0, copy=True, track=False):
    """recv a numpy array"""
    md = socket.recv_json(flags=flags)
    msg = socket.recv(flags=flags, copy=copy, track=track)
    buf = buffer(msg)
    A = numpy.frombuffer(buf, dtype=md['dtype'])
    return A.reshape(md['shape'])
3.

Các phương pháp này được thiết kế để thuận tiện, không phải cho hiệu suất, vì vậy các nhà phát triển muốn nhấn mạnh hiệu suất nên sử dụng các phương thức gửi/RECV được tuần tự hóa của riêng họ.

Sử dụng tuần tự hóa của riêng bạn

Nói chung, bạn sẽ muốn cung cấp tuần tự hóa của riêng bạn được tối ưu hóa cho ứng dụng hoặc thư viện của bạn. Điều này có thể bao gồm sử dụng tuần tự hóa ưa thích của riêng bạn ([MsgPack], [Protobuf]) hoặc thêm nén qua [ZLIB] trong thư viện tiêu chuẩn hoặc thư viện siêu nhanh [BLOSC].

Có hai mô hình đơn giản để thực hiện tuần tự hóa của riêng bạn: viết một hàm lấy ổ cắm làm đối số hoặc ổ cắm phân lớp để sử dụng trong các ứng dụng của riêng bạn.

Chẳng hạn, dưa chua thường có thể được giảm đáng kể về kích thước bằng cách nén dữ liệu.Những điều sau đây sẽ gửi dưa chua nén qua dây:

import zlib, cPickle as pickle

def send_zipped_pickle(socket, obj, flags=0, protocol=-1):
    """pickle an object, and zip the pickle before sending it"""
    p = pickle.dumps(obj, protocol)
    z = zlib.compress(p)
    return socket.send(z, flags=flags)

def recv_zipped_pickle(socket, flags=0, protocol=-1):
    """inverse of send_zipped_pickle"""
    z = socket.recv(flags)
    p = zlib.decompress(z)
    return pickle.loads(p)

Một cấu trúc dữ liệu phổ biến trong Python là mảng numpy.PYZMQ hỗ trợ gửi các mảng numpy mà không sao chép bất kỳ dữ liệu nào, vì chúng cung cấp giao diện bộ đệm Python.Tuy nhiên, chỉ cần bộ đệm không đủ thông tin để xây dựng lại mảng ở phía nhận.Dưới đây là một ví dụ về SEND/RECV cho phép gửi/recvs của các mảng không bao gồm dữ liệu DTYPE/hình dạng cần thiết để xây dựng lại mảng.

import numpy

def send_array(socket, A, flags=0, copy=True, track=False):
    """send a numpy array with metadata"""
    md = dict(
        dtype = str(A.dtype),
        shape = A.shape,
    )
    socket.send_json(md, flags|zmq.SNDMORE)
    return socket.send(A, flags, copy=copy, track=track)

def recv_array(socket, flags=0, copy=True, track=False):
    """recv a numpy array"""
    md = socket.recv_json(flags=flags)
    msg = socket.recv(flags=flags, copy=copy, track=track)
    buf = buffer(msg)
    A = numpy.frombuffer(buf, dtype=md['dtype'])
    return A.reshape(md['shape'])

[MSGPACK]Thư viện tuần tự hóa gói tin nhắn http://msgpack.org
[Protobuf]Bộ đệm giao thức Google http://code.google.com/p/protobuf
[Zlib]Mô -đun Python Stdlib cho nén ZIP:
import numpy

def send_array(socket, A, flags=0, copy=True, track=False):
    """send a numpy array with metadata"""
    md = dict(
        dtype = str(A.dtype),
        shape = A.shape,
    )
    socket.send_json(md, flags|zmq.SNDMORE)
    return socket.send(A, flags, copy=copy, track=track)

def recv_array(socket, flags=0, copy=True, track=False):
    """recv a numpy array"""
    md = socket.recv_json(flags=flags)
    msg = socket.recv(flags=flags, copy=copy, track=track)
    buf = buffer(msg)
    A = numpy.frombuffer(buf, dtype=md['dtype'])
    return A.reshape(md['shape'])
4
[BLOSC]BLOSC: Thư viện nén chặn, xáo trộn và không mất (và điên rồ) http://www.blosc.org