gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:38:01 26 4
gpt4 key购买 nike

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

最佳答案

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

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

关于python - Tornado Future 对象转储到 Redis 并从 Redis 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29252530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com