在条件失败的情况下重新运行函数"if"否则继续



我正在尝试使用boto3获取多个SQS队列中所有可用消息的总和。它执行得很好,但有时只有少数队列返回数据,而不是所有队列,并且程序返回空集。如何使用";如果";条件,以便在其中一个集合为空时重新运行函数?附言:我是编程新手导入boto3导入时间从datetime导入datetime,timedelta

sqs = boto3.client('sqs')
cloudwatch = boto3.client('cloudwatch')
asg = boto3.client('autoscaling')
response = sqs.list_queues(QueueNamePrefix ='Queue')
queuelist = response["QueueUrls"]
soa = 0.0
noi = 0.0
ABPI = 100
def SumOfAverages(queuelist, soa, response, cloudwatch):
for eachqueue in queuelist:
step0 = eachqueue.split('/')
step1 = step0[4]
response1 = cloudwatch.get_metric_statistics(
Namespace='AWS/SQS',
MetricName='ApproximateNumberOfMessagesVisible',
Dimensions=[
{
'Name': 'QueueName',
'Value': step1
},
],
StartTime=datetime.utcnow() - timedelta(minutes=1),
EndTime=datetime.utcnow(),
Period=60,
Statistics=[
'Average',
],

Unit='Count'
)
datapoints = response1['Datapoints']
print(datapoints)
#*Need If Condition*
for values in datapoints:
averages = values['Average']
soa += averages
return(soa)
result = SumOfAverages(queuelist, soa, response, cloudwatch)
print(result)

您可以尝试以下操作,

方法1

max_tries = 3
for _ in range(max_tries):
response1 = cloudwatch.get_metric_statistics(
Namespace='AWS/SQS',
MetricName='ApproximateNumberOfMessagesVisible',
Dimensions=[
{
'Name': 'QueueName',
'Value': step1
},
],
StartTime=datetime.utcnow() - timedelta(minutes=1),
EndTime=datetime.utcnow(),
Period=60,
Statistics=[
'Average',
],

Unit='Count'
)
if response1['Datapoints']:
break
else:
raise RuntimeError
datapoints = response1['Datapoints']

只有当循环在没有break调用的情况下退出时,才会执行else块。

方法2

基本上与上面的想法相同,但将代码放在一个专用函数中,然后可以在该函数上添加decorator来重试n次。

我使用这个算法

#try 5 times?
for attempt in xrange(5):
try:
#do_your_stuff()
result = SumOfAverages(queuelist, soa, response, cloudwatch)
print(result)
except Exception as e:
#manage exception if you need
print("*except* %s" %e)
else:
#If do_your_stuff() run and ends correctly then break for loop
break

最新更新