'receive a multipart message as a list of bytes or Frame objects
Parameters
flags : int, optional
Any supported flag: NOBLOCK. If NOBLOCK is set, this method
will raise a ZMQError with EAGAIN if a message is not ready.
If NOBLOCK is not set, then this method will block until a
message arrives.
copy : bool, optional
Should the message frame(s) be received in a copying or non-copying manner?
If False a Frame object is returned for each part, if True a copy of
the bytes is made for each frame.
track : bool, optional
Should the message frame(s) be tracked for notification that ZMQ has
finished with it? (ignored if copy=True)
Returns
msg_parts : list
A list of frames in the multipart message; either Frames or bytes,
depending on `copy`.'

def recv_multipart(self, flags=0, copy=True, track=False):

    parts = [self.recv(flags, copy=copy, track=track)]
    while self.getsockopt(zmq.RCVMORE):
        part = self.recv(flags, copy=copy, track=track)
        parts.append(part)
    return parts
