代码之家  ›  专栏  ›  技术社区  ›  saas1990

Python while循环和超时-寻找更好的解决方案

  •  1
  • saas1990  · 技术社区  · 4 年前

    以下功能的目标是:

    1. 将K8s群集上的应用程序实例缩小到0。
    2. 等待缩放完成。
    3. 验证当前比例是否达到0,并且该应用程序是否不存在活动实例。
    4. 将应用程序放大到其原始比例。
    5. 等待放大完成。
    6. 验证当前比例是否达到其原始比例,以及该应用是否存在活动实例。

    _get_desired_replicas() ->返回当前运行的应用程序实例的计数
    _instances() ->返回活动实例及其ID的列表。

    问题

    _实例() 在缓存机制上工作,不会立即反映当前系统状态。有一个明显的3-4秒的延迟,之后将获取系统的正确状态。由于_instances()没有立即恢复当前系统状态,这会导致while循环被卡住(请参阅下面的示例),直到超时过期。
    一个选择是选择 or 而不是 and 但我不想朝那个方向走。

    def _restart_k8sapp_wait(app, timeout=SCALE_UPDOWN_WAIT):
        _sleep_interval = 1
        desired_scale = _get_desired_replicas(app)
        if desired_scale == 0:
            return False
        _scale_app(app, 0)
        barrier_completed = time.time() + timeout
        while time.time() < barrier_completed:
            instances = _instances(app)
            current_scale = _get_desired_replicas(app)
            if current_scale == 0 and not instances:
                _scale_app(app, desired_scale)
                refreshed_instances = _instances(app)
                refreshed_scale = _get_desired_replicas(app)
                if refreshed_scale == desired_scale and refreshed_instances:
                    return True
            time.sleep(_sleep_interval)
        return False
    
    
    Example: while loop iterations after app scale down
    - iter 1:
       desired_scale = 1
       instances=[item1], current_scale = 0
       if current_scale == 0 and not instances: evaluated to False
       iter 1 finished ..
    
    - iter 2:
       desired_scale = 1
       instances=[], current_scale = 0
       if current_scale == 0 and not instances: evaluated to True
          instances = [], current_scale = 1
          if current_scale == desired_scale and not instances: evaluated to False
       iter 2 finished ..    
    
    - iter 3:
       desired_scale = 1
       instances=[item1], current_scale = 1
       if current_scale == 0 and not instances: evaluated to False
       iter 3 finished ..
    
    0 回复  |  直到 4 年前