在Python中访问全局队列对象

3 投票
2 回答
6710 浏览
提问于 2025-04-17 07:31

我正在用Python开发一个消息应用,它可以和Twitter连接。我想创建一个全局的先进先出(FIFO)队列,让TwitterConnection对象可以用来插入新消息。

这是应用的主要部分:

    #!/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()

具体来说,我希望能够调用TwitterConnector类的.GetMentions()方法,处理任何新的提及,并把这些消息放入队列中,单独进行处理。

这是目前的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状态对象映射到一个新对象,这个新对象会包含一些属性,比如:来源网络(Twitter)、用户名、消息和可用的位置信息。然后,这个新对象会被放入队列。

最终还会有其他连接器,用于其他消息系统,它们会执行类似的操作。它们会接收消息,填充新的消息对象,并将它们放入同一个队列中进行进一步处理。一旦消息完全处理完,就会形成一个响应,然后将其添加到适当的队列中进行发送。使用上面描述的新对象,一旦实际处理了推文内容,就可以根据来源网络和用户名,通过Twitter将响应返回给发起者。

我曾考虑在构造函数中传递队列的引用(或者作为方法的参数),我也想过修改方法以返回新对象的列表,然后遍历这些对象将它们放入队列,但我想确保没有更好或更有效的处理方式。我还希望能对日志对象和数据库处理器做同样的事情。你有什么想法吗?

2 个回答

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)
4

问题是“global”应该单独写在一行上。

global requestQueue
requestQueue.add(mention)

而且,requestQueue必须在定义这个类的模块里出现。

如果你是从另一个类导入requestQueue这个符号,那么根本不需要使用global。

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

撰写回答