我需要一种快速的方法,在python多处理进程之间通过zeromq每秒发送300条短消息.每条消息都需要包含一个ID和time.time()
msgpack似乎是在通过zeromq发送之前序列化dict的最好方法,而且很方便,msgpack有一个我需要的例子,除了它有一个datetime.datetime.now().
import datetime
import msgpack
useful_dict = {
"id": 1,
"created": datetime.datetime.now(),
}
def decode_datetime(obj):
if b'__datetime__' in obj:
obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%dT%H:%M:%S.%f")
return obj
def encode_datetime(obj):
if isinstance(obj, datetime.datetime):
return {'__datetime__': True, 'as_str': obj.strftime("%Y%m%dT%H:%M:%S.%f")}
return obj
packed_dict = msgpack.packb(useful_dict, default=encode_datetime)
this_dict_again = msgpack.unpackb(packed_dict, object_hook=decode_datetime)
问题是他们的例子不起作用,我得到这个错误:
obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%dT%H:%M:%S.%f")
KeyError: 'as_str'
也许是因为我在python 3.4上,但我不知道strptime的问题.非常感谢你的帮助.
解决方法:
Python3和Python2管理不同的字符串编码:encoding-and-decoding-strings-in-python-3-x
然后需要:
>使用b’as_str'(而不是’as_str’)作为字典键
>对存储的值使用编码和解码
修改这样的代码适用于python2和python3:
import datetime
import msgpack
useful_dict = {
"id": 1,
"created": datetime.datetime.now(),
}
def decode_datetime(obj):
if b'__datetime__' in obj:
obj = datetime.datetime.strptime(obj[b'as_str'].decode(), "%Y%m%dT%H:%M:%S.%f")
return obj
def encode_datetime(obj):
if isinstance(obj, datetime.datetime):
obj = {'__datetime__': True, 'as_str': obj.strftime("%Y%m%dT%H:%M:%S.%f").encode()}
return obj
packed_dict = msgpack.packb(useful_dict, default=encode_datetime)
this_dict_again = msgpack.unpackb(packed_dict, object_hook=decode_datetime)