2011-12-02 63 views
3

我在python中構建了一個與twitter接口的消息應用程序我想創建一個全局的fifo隊列,twitterConnection對象可以通過它訪問插入新消息。訪問python中的全局隊列對象

這是應用程序的主要部分:

#!/usr/bin/python 

    from twitterConnector import TwitterConnector 
    from Queue import deque 

    #instantiate the request queue 
    requestQueue = deque() 

    #instantiate the twitter connector 
    twitterInterface = TwitterConnector() 

    #Get all new mentions 
    twitterInterface.GetMentions() 

具體來說,我希望能夠調用.GetMentions()的TwitterConnector類的方法和處理任何新提及,並把這些消息到隊列分開處理。

這是twitterConnector類到目前爲止:

class TwitterConnector: 
    def __init__(self): 
     self.connection = twitter.Api(consumer_key=self.consumer_key,consumer_secret=self.consumer_secret,access_token_key=self.access_token_key,access_token_secret=self.access_token_secret) 
     self.mentions_since_id = None 

    def VerifyCredentials(self): 
     print self.connection.VerifyCredentials() 

    def GetMentions(self): 
     mentions = self.connection.GetMentions(since_id=self.mentions_since_id) 
     for mention in mentions: 
     print mention.text 
     global requestQueue.add(mention) # <- error 

任何援助將不勝感激。

更新:讓我看看我能否澄清一下用例。我的TwitterConnector旨在檢索消息,並最終將twitter狀態對象轉換爲包含下游處理所需信息的簡化對象。在相同的方法中,它將執行一些其他計算來嘗試確定其他所需信息。它實際上是我想要放入隊列的轉換對象。希望這是有道理的。作爲一個簡化的例子,這個方法會將twitter狀態對象映射到一個新的對象,該對象將包含如origin網絡(twitter),用戶名,消息和位置(如果可用)的屬性。這個新對象將被放入隊列中。

最終會有其他連接器用於執行類似操作的其他消息傳遞系統。他們將收到一條消息,填充新的消息對象並將它們放入同一隊列以供進一步處理。一旦消息被完全處理後,將制定一個響應,然後將其添加到適當的隊列中以供傳送。使用上面描述的新對象,一旦推特內容的實際處理髮生,然後基於起源網絡和用戶名,響應可以通過twitter返回給始發者。

我曾想過在承包商中傳遞對隊列的引用(或作爲方法的參數)我也想過修改方法以返回新對象的列表並遍歷它們以將它們放入隊列,但我想確保沒有更好或更有效的方法來處理這個問題。我也希望能夠用日誌記錄對象和數據庫處理程序做同樣的事情。思考?

+0

你得到的錯誤是什麼? – jsalonen

+0

我會問你很明顯:你爲什麼要定義你自己的'TwitterConnector'而不是使用現有的Python API呢? – jsalonen

+1

對於健壯的共享隊列,您可能需要使用AMQP。看看芹菜。 –

回答

3

的問題是,「全局」應該出現在一行的自己的

global requestQueue 
requestQueue.add(mention) 

而且,請求隊列必須出現所定義的類的模塊中。

如果您從另一個類中導入requestQueue符號,則根本不需要全局符號。

from some_module import requestQueue 
class A(object): 
    def foo(o): 
     requestQueue.add(o) # Should work 
+0

同意。在語法層面上,這是一個有效的解決方案,但它不能解決設計中的問題。 – jsalonen

+3

我的哲學是第一個回答這個人,然後告訴他爲什麼這個問題是錯誤的...... – idanzalz

2

這是爲了避免全局一般好主意;經常存在更好的設計。有關全局問題的詳細信息,請參閱([1][2],[3],[4])。

如果使用全局變量要共享多個TwitterConnector實例之間的單一requestQueue,你也可以在隊列傳遞給在其構造連接器:

class TwitterConnector: 
    def __init__(self, requestQueue): 
     self.requestQueue = requestQueue 
     ... 

    def GetMentions(self): 
     mentions = self.connection.GetMentions(since_id = self.mentions_since_id) 
     requestQueue = deque() 
     for mention in mentions: 
     print mention.text 
     self.requestQueue.add(mention) 

相應地,您需要提供您的requestQueue到構造函數爲:

twitterInterface = TwitterConnector(requestQueue) 
+1

我同意不使用全局變量,但單身人士仍然是一個非常有效的模式。只需要在不同的模塊上定義,以便它們可以作爲符號導入 – idanzalz

+0

您假定每次調用GetMentions CAN都會返回一個不同的隊列,並且不需要隨時間聚合。這是他試圖做的主要功能差異 – idanzalz

+0

有效的一點。重構。我也同意單身人士沒有任何問題,但我沒有在這裏看到使用這種模式的觀點(爲什麼我們想讓'twitterConnector'依賴於使用它的特定應用程序?)。 – jsalonen