2015-03-25 45 views
0

我正在開發帶有龍捲風的推送系統。當我正在進行長時間輪詢時,我需要保留一個Future Object的列表,以便稍後爲它們設置結果。然後我想在Redis中保留Future列表,所以我使用Pickle模塊「轉儲」每個Future,並將其設置爲Redis,但是在我從Redis得到它並「加載」它之後。我發現它不是最初的Future Object,當我在這個未來的對象上調用set_result函數時,它不能像我期望的那樣工作。Tornado未來對象轉儲到Redis並從Redis加載

任何人都可以幫助我呢?

這是我的代碼的一部分:

@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

Future對象不能有效地進行酸洗。未完成的Future只是一個具有回調列表的佔位符,並且回調不能被醃製。 (此外,回調列表可隨時更改;您可以在沒有異常的情況下致電pickle.dumps()這一事實意味着您要做的太早;應用程序還沒有機會附加其回調) 。

您不必在redis中存儲Futures,而必須在內存中保存一張地圖並在redis中存儲標識符。如果你有多個服務器進程,那麼你當然會擁有多個這樣的地圖。你必須通過向每個服務器廣播每條消息(不知道誰在監聽什麼內容),或者在redis中包含某種地址信息,來確保消息能夠到達他們需要的位置。

+0

感謝Ben,我停止酸洗Future併爲每個實例(進程)製作'maps',但最後我發現一旦我請求將消息發送給所有這些消息,我仍然無法控制來自不同實例的所有Future。我認爲'分享未來'的解決方案並不適合我的推送系統。 – 2015-03-26 09:43:28

+0

我知道Redis Pub/Sub可以使用,我發現了龍捲風的相關異步庫。所以現在我很好奇它如何在多進程環境下工作,它如何控制來自不同實例的IOLoop或Object? – 2015-03-26 09:46:35

+0

您不「控制來自不同實例的IOLoop」。 pubsub背後的想法是,你發佈事件時不知道誰(如果有人)正在傾聽。一個節點在redis中留下消息;另一個節點(或多個節點)選取它們。 – 2015-03-26 12:26:54