我正在开发一个带有龙卷风的推送系统。当我进行长时间轮询时,我需要保留一个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)
答案 0 :(得分:0)
Future
个对象无法被有效地腌制。未完成的Future
只是一个包含回调列表的占位符,并且无法回调回调。 (此外,回调列表可以随时更改;您可以在没有异常情况下调用pickle.dumps()
的事实意味着您过早地执行此操作;应用程序没有机会附加它的回调还没有。)
您不必将Futures
存储在redis中,而是必须在内存中保留地图并将标识符存储在redis中。如果您有多个服务器进程,那么当然您将拥有多个这些映射。你必须通过向每个服务器广播每条消息(不知道谁在听什么)或者在redis中包含某种寻址信息来确保消息到达他们需要去的地方。