【问题标题】:Tornado Future object dumps to Redis and loads from RedisTornado Future 对象转储到 Redis 并从 Redis 加载
【发布时间】:2015-03-25 10:00:21
【问题描述】:

我正在使用 Tornado 开发一个推送系统。由于我正在进行长时间轮询,我需要保留一个未来对象列表,以便稍后为它们设置结果。然后我想将 Future 列表保留在 Redis 中,所以我用 Pickle 模块“转储”每个 Future 并将其设置为 Redis,但是在我从 Redis 获取它之后,并“加载”它。我发现它不是原来的未来对象,当我在这个未来对象上调用 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)

【问题讨论】:

    标签: python redis tornado pickle concurrent.futures


    【解决方案1】:

    Future 对象不能有效地被腌制。未完成的Future 只是一个带有回调列表的占位符,回调不能被pickle。 (此外,回调列表可以随时更改;您可以毫无例外地调用pickle.dumps(),这意味着您做得太早了;应用程序没有机会附加它的回调但是)。

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

    【讨论】:

    • 感谢 Ben,我停止腌制 Future 并为每个实例(进程)制作“地图”,但最后我发现,一旦我请求向所有实例发送消息,我仍然无法控制来自不同实例的所有 Future那些。我认为“分享未来”的解决方案在我的推送系统中不合适。
    • 我知道 Redis Pub/Sub 可以使用,我找到了相关的龙卷风异步库。所以现在我很好奇它是如何在多进程环境下工作的,它是如何控制来自不同实例的 IOLoop 或 Object 的?
    • 您不会“从不同的实例控制 IOLoop”。 pubsub 背后的想法是,您在不知道谁(如果有人)在听的情况下发布事件。一个节点在redis中留下消息;另一个节点(或多个节点)接收它们。
    • 好的,我明白了。稍后我将深入研究 redis sub/pub。您是否认为可以使用 Future 来实现这个,或者没有 Redis Pub/Sub 的任何其他解决方案,我的意思是我真的不想在我完全了解它的机制之前接触 Redis Pub/Sub,这对我来说就像一个魔盒目前。任何其他“纯龙卷风”解决方案都可以做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2015-09-22
    • 2022-10-03
    • 2018-10-22
    • 2021-12-31
    • 2018-07-02
    • 2011-04-22
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多