轮询最大值 wait_time 除非条件 python 2.7

Polling for a maximum wait_time unless condition in python 2.7

我有一个函数可以执行 shell 命令在机器上部署服务器。此函数采用以下参数:

现在,一旦 commanddirectory path 内部执行,函数 time.sleeps 直到 wait time 然后检查正在侦听 server port.

虽然此方法有效,但它确实浪费了 command 秒的大量时间,而它开始所花费的时间比 wait time.

少得多

我正计划创建一个服务员,它将最多等待 wait time,但会定期轮询 server port。如果在 wait time 结束之前发现了进程,我希望函数仅从该点安全地 return,而不是让进程阻塞直到结束。

我不知道如何进行。我能想到的最接近的是创建一个轮询对象(使用 select.poll),但是一个示例(或一个包,如果可用)会对我有很大帮助。

我当前的功能类似于:

run_local_command(
    ['nohup', start_command, ">>", logfile, '2>>', errfile, '&'],
    explanation="Starting server",
    target_dir=target_dir
)
time.sleep(wait_time)
# Get the PIDs listening to the specific port
processes = [
    p for p in psutil.net_connections(kind='inet')
    if p.laddr[1] == port and p.status == 'LISTEN'
]
logger.debug("Logged following processes for the service port: %s", processes)
pids = [x.pid for x in processes if x.pid is not None]

我通常用来等待条件满足或超时的是这样一个小函数:

def wait_condition(condition, timeout=5.0, granularity=0.3, time_factory=time):
    end_time = time.time() + timeout   # compute the maximal end time
    status = condition()               # first condition check, no need to wait if condition already True
    while not status and time.time() < end_time:    # loop until the condition is false and timeout not exhausted
        time.sleep(granularity)        # release CPU cycles
        status = condition()           # check condition
    return status                      # at the end, be nice and return the final condition status : True = condition satisfied, False = timeout occurred.

因此,通过为该方法提供一个 condition 方法,该方法将 return 在调用且满足条件时为真(否则为假)。

这将循环(并暂停一些以避免占用太多CPU)并在超时结束时或条件为真时退出。

在你的情况下,条件方法可能会做这样的事情:

def port_opened():
    return [p for p in psutil.net_connections(kind='inet') if p.laddr[1] == port and p.status == 'LISTEN']    # assuming that an empty list is False in python