Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AWS EC2:如何防止实例状态检查的无限循环?_Python_Python 3.x_Amazon Web Services_Amazon Ec2_Boto3 - Fatal编程技术网

Python AWS EC2:如何防止实例状态检查的无限循环?

Python AWS EC2:如何防止实例状态检查的无限循环?,python,python-3.x,amazon-web-services,amazon-ec2,boto3,Python,Python 3.x,Amazon Web Services,Amazon Ec2,Boto3,我有以下python boto3代码,其中包含一个潜在的无限while循环。通常,几分钟后,while循环成功。然而,如果AWS端出现故障,程序可能会无限期挂起 我相信这不是最恰当的方法 # credentials stored in ../.aws/credentials # region stored in ../.aws/config # builtins from time import sleep # plugins import boto3 # Assign server ins

我有以下python boto3代码,其中包含一个潜在的无限
while循环。通常,几分钟后,
while循环
成功。然而,如果AWS端出现故障,程序可能会无限期挂起

我相信这不是最恰当的方法

# credentials stored in ../.aws/credentials
# region stored in ../.aws/config

# builtins
from time import sleep
# plugins
import boto3

# Assign server instance IDs.
cye_production_web_server_2 = 'i-FAKE-ID'

# Setup EC2 client
ec2 = boto3.client('ec2')

# Start the second web server.
start_response = ec2.start_instances(
    InstanceIds=[cye_production_web_server_2, ],
    DryRun=False
)

print(
    'instance id:',
    start_response['StartingInstances'][0]['InstanceId'],
    'is',
    start_response['StartingInstances'][0]['CurrentState']['Name']
)

# Wait until status is 'ok'
status = None
while status != 'ok':
    status_response = ec2.describe_instance_status(
        DryRun=False,
        InstanceIds=[cye_production_web_server_2, ],
    )
    status = status_response['InstanceStatuses'][0]['SystemStatus']['Status']
    sleep(5)    # 5 second throttle

print(status_response)
print('status is', status.capitalize())

您可以尝试在
for
循环中执行,而不是使用固定的尝试次数

例如:

MAX_RETRIES = 5

# Try until status is 'ok'
for x in range(MAX_RETRIES):
    status_response = ec2.describe_instance_status(
        DryRun=False,
        InstanceIds=[cye_production_web_server_2, ],
    )
    status = status_response['InstanceStatuses'][0]['SystemStatus']['Status']
    if status != 'ok':
        sleep(5)    # 5 second throttle
    else:
        break

您可以尝试在
for
循环中执行,而不是使用固定的尝试次数

例如:

MAX_RETRIES = 5

# Try until status is 'ok'
for x in range(MAX_RETRIES):
    status_response = ec2.describe_instance_status(
        DryRun=False,
        InstanceIds=[cye_production_web_server_2, ],
    )
    status = status_response['InstanceStatuses'][0]['SystemStatus']['Status']
    if status != 'ok':
        sleep(5)    # 5 second throttle
    else:
        break

在循环中实现一个计数器,并在多次尝试后失败

status = None
counter = 5
while (status != 'ok' and counter > 0):
    status_response = ec2.describe_instance_status(
        DryRun=False,
        InstanceIds=[cye_production_web_server_2, ],
    )
    status = status_response['InstanceStatuses'][0]['SystemStatus']['Status']
    sleep(5)    # 5 second throttle
    counter=counter-1

print(status_response)
print('status is', status.capitalize())

在循环中实现一个计数器,并在多次尝试后失败

status = None
counter = 5
while (status != 'ok' and counter > 0):
    status_response = ec2.describe_instance_status(
        DryRun=False,
        InstanceIds=[cye_production_web_server_2, ],
    )
    status = status_response['InstanceStatuses'][0]['SystemStatus']['Status']
    sleep(5)    # 5 second throttle
    counter=counter-1

print(status_response)
print('status is', status.capitalize())

使用超时可能是一个更好的主意

import time 

systemstatus = False
timeout = time.time() + 60*minute

while systemstatus is not True:
    status = ec2.describe_instance_status( \
                 DryRun = False,
                 InstanceIds = [instance_id]
             )

    if status['InstanceStatuses'][0]['SystemStatus']['Status'] == 'ok':
        systemstatus = True

    if time.time() > timeout:
        break
    else:
        time.sleep(10)

使用超时可能是一个更好的主意

import time 

systemstatus = False
timeout = time.time() + 60*minute

while systemstatus is not True:
    status = ec2.describe_instance_status( \
                 DryRun = False,
                 InstanceIds = [instance_id]
             )

    if status['InstanceStatuses'][0]['SystemStatus']['Status'] == 'ok':
        systemstatus = True

    if time.time() > timeout:
        break
    else:
        time.sleep(10)

5次重试转换为(5秒*5次重试=25秒),我可以增加或减少这个值。在这种情况下,是否有理由不使用while循环。for循环(在本例中似乎更详细)。它更详细一点,这是真的。您可以按照另一个响应者的建议使用while循环,这也会起作用。不使用while循环的原因是为了防止陷入无限循环中,正如您所描述的那样,确定5次重试(5sec*5retries=25秒),我可以增加或减少该值。在这种情况下,是否有理由不使用while循环。for循环(在本例中似乎更详细)。它更详细一点,这是真的。您可以按照另一个响应者的建议使用while循环,这也会起作用。不使用while循环的原因是为了防止陷入您描述的无限循环中