首页 > 解决方案 > 需要为等待执行某些操作的函数添加上限

问题描述

有一个功能可以检查列表中是否包含项目。如果列表中有任何项目,它将等待 5 秒并在 while 循环中再次检查该列表。

以下是示例:

from time import sleep

def list_unfinished_jobs():
    ''' Any operation performed it creates jobs and
        IDs of jobs gets fetch in get_jobs() method
        :return : list of job ids or None if no jobs found 
    '''
    jobs =  get_jobs() # ['JID_1213133', 'JID_3131314', 'JID_23242242'] 
    return jobs

def wait_for_job_completion():
    while list_unfinished_jobs():
        sleep(5)

现在我有一个场景,操作可能会卡住,作业无法完成,get_jobs() 永远不会变空。

所以我写了一个逻辑,它检查 20 次工作是否已经完成。每次它休眠 5 秒,我会减少迭代时的时间。下面是代码:

def wait_for_job_completion(node):
    """Wait for job to complete

    :param node: an ironic node object.
    """
    retries = 20
    while retries > 0:
        if not list_unfinished_jobs(node):
            return
        if list_unfinished_jobs(node):
            sleep(wait_clock)
        retries -= 1
        if retries == 0:
            err_msg = "Timed out waiting for the job to clear"
            LOG.error(err_msg)
            raise exception.DracOperationError(error=msg)

我需要另一种方法来检查任何功能 n 次以执行 n 操作。

任何帮助将不胜感激。提前致谢。

标签: pythonpython-3.xpython-2.7

解决方案


你没有说为什么你想要一种不同的方式来做这件事。但如果是缩短代码的问题,则可以进行一些“改进”。

您不必调用 list_unfinished_jobs 两次:

 if not list_unfinished_jobs(node):
        return
 else:
        sleep(wait_clock)

在这里使用 for 循环也更有意义:

for attempt in range(20):
        if not list_unfinished_jobs(node):
            return
        else:
            sleep(wait_clock)
err_msg = "Timed out waiting for the job to clear"
LOG.error(err_msg)
raise exception.DracOperationError(error=msg)

推荐阅读