0

我正在用 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)
4

1 回答 1

0

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

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

于 2015-03-25T13:53:51.020 回答