python – MessagePack和datetime

我需要一种快速的方法,在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)
上一篇:ZeroRPC和IronPython


下一篇:php – 使用zeromq实现Task Farm消息传递模式