wai*_*ani 9 python boto amazon-sqs amazon-web-services
我有一个python脚本使用ec2实例上的boto库,它是自动缩放组的一部分.该脚本处理来自SQS队列的消息:
import boto
from boto.sqs.message import Message
conn = boto.connect_sqs()
q = conn.create_queue('queue-name')
while (qin.count() > 0):
m = q.get_messages()
#do something with the message
Run Code Online (Sandbox Code Playgroud)
使用while语句有意义吗?count()是否实时更新为:
即使队列为空,如何使此脚本不断监听队列的新增内容?
在这个问题处理带有php脚本的SQS队列中的项目时,有人提到'sqs ruby客户端库有一个方法"轮询",它连续轮询队列并在队列中接收消息时将其传递给一个块'.Python中有相应的东西吗?
还有人建议SNS可用于通知脚本消息队列状态,但我不知道如何配置具有SNS的响应系统,因为度量标准报警不够精细.
您不应该依赖队列的计数,因为它只是为了提供近似计数而不保证准确.
如果您想永远保持轮询,请执行以下操作:
while 1:
messages = q.get_messages()
# do something with messages
time.sleep(N)
Run Code Online (Sandbox Code Playgroud)
我已经添加了对time.sleep的调用以在循环中引入延迟.N的值应该至少为一秒,并且可能会更多,具体取决于您期望新消息在队列中出现的速度.如果你没有在循环中加入某种延迟,你可能会开始受到服务的限制.
为避免多次读取消息,您应尝试将队列的可见性超时调整为大于处理消息所用时间的值,然后确保在处理完成时删除消息.
小智 5
例子:
# wait_time_seconds count only 1 request in x seconds (0 - 20)
# num_messages get x messages in same request (1 - 10)
while 1:
logger.info("... waiting messages ...")
messages = queue_in.get_messages(wait_time_seconds=20, num_messages=10)
for message in messages:
logger.info('message: %s' % (message,))
queue_in.delete_message(message)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12528 次 |
| 最近记录: |