【问题标题】:Python SQS boto unreliable or bad implementation?Python SQS boto 不可靠或执行不正确?
【发布时间】:2014-11-18 16:12:53
【问题描述】:

我有一个在 EC2 上运行的盒子,其中包含 2 个不同的 python 脚本,这些脚本使用 2 个不同的 SQS 队列。我的脚本在上周运行得非常好,突然之间其中一个脚本需要很长时间才能从 SQS 队列中提取消息。即使它设法拉出消息,它也会拉出很多重复的消息。我的 2 个脚本使用相同的方法:

def getMessages(self, n):
    '''returns n messages erasing them, mutliple of 10'''
    msgs=[]
    rs=self.queue.get_messages(10)
    if len(rs) < 1:
        return []
    count = 0
    while count < n or len(rs) < 10:
        msgs.extend(rs)
        rs=self.queue.get_messages(10)
        count += 10
    # delete pulled messages
    for msg in msgs:
        self.queue.delete_message(msg)

    return msgs

在这种情况下,self.queue 是以下的一个实例:

    self.conn = SQSConnection(SQS_ACCESS_KEY, SQS_SECRET_KEY)
    self.queue = self.conn.get_queue(queue_name)

我的脚本使用 getMessages() 方法如下:

while True:
    print 'Getting SQS messages'
    messages = sqs.getMessages(50)
    print 'Got %s messages' % len(messages)

    for msg in messages:
        do_something(msg)

    print 'Going to sleep'
    time.sleep(sleep_time)

现在,我的脚本提取消息的时间太长了,它会打印出Getting SQS messages,有时会在那里停留数小时。更奇怪的是,如果我打开一个 ipython shell 并执行getMessages(50),它运行得非常快,而我的其他脚本的工作方式完全相同,但在不同的队列上,我对此完全没有问题。

这里可能有什么问题,谢谢。

【问题讨论】:

    标签: python amazon-ec2 boto amazon-sqs


    【解决方案1】:

    您在 while 循环中的 getMessages 函数中存在一些错误:
    1.使用count += len(rs)
    2.主要bug:你不需要

    or len(rs) < 10
    

    条件,因为 SQS 最多可以收到 10 条消息,如果您的队列已满,并且每次收到 10 条消息,您将有一个无限循环。

    另外我认为你应该考虑使用yield 语句来返回消息,处理它们并在它们被处理之后,才将它们从队列中删除。

    还有一点,检查if len(rs) &lt; 1: 的pythonic 方法是if not rs:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-14
      • 2019-01-28
      • 2012-04-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多