Python 未删除SQS消息

Python 未删除SQS消息,python,amazon-sqs,Python,Amazon Sqs,我使用的是python,当我从SQS中读取内容时,它们不会被正确删除,几秒钟后会被再次读取 我使用此代码段发布作业 #!/usr/bin/python #simple code snippet that posts a message to SQS import boto from boto.sqs.message import Message conn = boto.connect_sqs() q = conn.create_queue('myqueue') newJob.set_body

我使用的是python,当我从SQS中读取内容时,它们不会被正确删除,几秒钟后会被再次读取

我使用此代码段发布作业

#!/usr/bin/python 

#simple code snippet that posts a message to SQS
import boto
from boto.sqs.message import Message
conn = boto.connect_sqs()
q = conn.create_queue('myqueue')
newJob.set_body("Message")
q.write(newJob)
下面是消化消息的代码

#!/usr/bin/python 

#simple code snippet that reads a message from SQS
import boto
from boto.sqs.message import Message
conn = boto.connect_sqs()
q = conn.get_queue('myqueue')

while True:
    try:
        print q.read(10).get_body()
    except:
        pass
运行两个脚本后,第二个脚本将每隔15秒左右打印一次“消息”

我真的很困惑,为什么它没有被移除,为什么它在15秒后才回来。 (它也不会出现在AWS控制台中,我从那里发送的消息也不会被处理)

免责声明:我以前从未使用过
boto.sqs
,此答案仅基于阅读

根据下面的描述,消息在被读取后看起来像是1)不会自动删除,2)在特定的时间段内不可见

有一个可选参数用于创建队列,称为可见性超时。这基本上控制了一条消息在被读取后对其他队列读取器不可见的时间(有关更详细的解释,请参阅SQS文档)。如果未明确指定,则将使用SQS提供的任何默认值(当前为30秒)创建队列

更新:确认我的上述理解

…因此,Amazon SQS不会删除消息,相反,您的消费组件必须在接收和处理消息后将其从队列中删除

…因此,Amazon SQS使用可见性超时阻止它们,这是Amazon SQS阻止其他消费组件接收和处理该消息的时间段


因此,我想您需要在从队列中成功读取消息后(如果您不希望其他客户端使用它)显式地读取消息。

正确。。。否则,SQS假定使用者在处理消息时发生故障、崩溃、遇到未处理的异常等,并重新传递消息,以免丢失。