我需要通过websocket发送一个包含几个大型Pandas Dataframe的pickle python字典(两端都是Python API)。为了提高性能,我想在通过websocket发送之前压缩pickle对象。但是,执行此操作时,收到的消息始终为“无”。
客户端:
df = pd.DataFrame({'a':[1,2,3,4]})
d = dict(b=df)
msg = zlib.compress(pickle.dumps(d),5)
socket.send(msg)
服务器:
msg = socket.receive()
# msg is always None when called with client code above.
data = pickle.loads(zlib.decompress(msg))
有更好的方法吗? 我通过Flask-Sockets框架使用gevent-websocket。
答案 0 :(得分:1)
要在Python 2.7中发送二进制数据,您必须在客户端(ws4py)中设置binary=True
:
socket.send(msg, Binary=True)
另外请注意,在接收端,您需要在发送到zlib.decompress()之前将msg包装在缓冲区中
msg = socket.receive()
data = pickle.loads(zlib.decompress(buffer(msg)))