gpt4 book ai didi

python - 轮询最大 wait_time,除非 python 2.7 中的条件

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:05 24 4
gpt4 key购买 nike

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

  • 目录路径
  • 命令
  • 服务器端口
  • 等待时间

现在,一旦commanddirectory path 内部执行,函数time.sleep直到 wait time然后检查正在监听 server port 的进程.

虽然这个方法很有效,但是确实浪费了command大量的时间。其启动时间远小于 wait time .

我打算创建一个服务员,它最多等待 wait time ,但继续轮询 server port以规则的小间隔。如果wait time之前找到进程结束了,我希望函数仅从该点安全返回,而不是让进程阻塞直到结束。

我不知道如何继续。我能想到的最接近的是创建一个 poll 对象(使用 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 方法,该方法将在调用且满足条件时返回 True(如果不满足则返回 False)。

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

在您的情况下,条件方法可能会执行如下操作:

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

关于python - 轮询最大 wait_time,除非 python 2.7 中的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45455898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com