Tornado Future对象转储到Redis并从Redis加载

时间:2015-03-25 10:00:22

标签: python redis tornado pickle concurrent.futures

我正在开发一个带有龙卷风的推送系统。当我进行长时间轮询时,我需要保留一个Future Object列表,以便稍后为它们设置结果。然后我想在Redis中保留Future列表,所以我使用Pickle模块转储每个Future并将其设置为Redis,但是在我从Redis获取它之后,“加载”它。我发现它不是原始的Future Object,当我在这个未来的对象上调用set_result函数时,它不能像我期望的那样工作。

任何人都可以帮我这个吗?

这是我的代码的一部分:

@singleton
class MessageProxy:

    def register_subscriber(self, subscriber):
        r.set("subscriber", pickle.dumps(subscriber))

    def send_message(self, message):
        subscriber = pickle.loads(r.get("subscriber"))
        subscriber.set_result(message.content)

1 个答案:

答案 0 :(得分:0)

Future个对象无法被有效地腌制。未完成的Future只是一个包含回调列表的占位符,并且无法回调回调。 (此外,回调列表可以随时更改;您可以在没有异常情况下调用pickle.dumps()的事实意味着您过早地执行此操作;应用程序没有机会附加它的回调还没有。)

您不必将Futures存储在redis中,而是必须在内存中保留地图并将标识符存储在redis中。如果您有多个服务器进程,那么当然您将拥有多个这些映射。你必须通过向每个服务器广播每条消息(不知道谁在听什么)或者在redis中包含某种寻址信息来确保消息到达他们需要去的地方。