轮询最大值 wait_time 除非条件 python 2.7
Polling for a maximum wait_time unless condition in python 2.7
我有一个函数可以执行 shell 命令在机器上部署服务器。此函数采用以下参数:
- 目录路径
- 命令
- 服务器端口
- 等待时间
现在,一旦 command
从 directory path
内部执行,函数 time.sleep
s 直到 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
我有一个函数可以执行 shell 命令在机器上部署服务器。此函数采用以下参数:
- 目录路径
- 命令
- 服务器端口
- 等待时间
现在,一旦 command
从 directory path
内部执行,函数 time.sleep
s 直到 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