Python - 等待远程系统启动的最佳方式
Python - best way to wait until a remote system is booted
我正在使用 LAN 唤醒在 python 脚本中启动某个服务器。
当我可以成功API请求时,服务器在线,例如:
return requests.get(
url + path,
auth=('user', user_password),
headers={'Content-Type':'application/json'},
verify=False,
timeout=0.05
).json()
等待服务器启动过程(直到可以通过 API 访问)而不用循环请求向网络发送垃圾邮件的最佳方法是什么?
我相信你非常接近。为什么不将该请求放在 while
和 try except
块中?
while True:
try:
return requests.head(...)
except requests.exceptions.ConnectionError:
time.sleep(0.5)
您的两个选择是轮询远程服务直到它响应或将服务配置为以某种方式通知您它已启动。
在循环中发送请求确实没有错,只要您不经常这样做。如果服务需要大约 10 秒才能启动,则每秒检查一次是合理的。如果大约需要 10 分钟,那么每 30 秒左右可能就可以了。
备选方案 - 某种推送通知 - 更优雅,但它需要您启动一些其他服务并且 运行 已经在侦听通知。例如,您可以在重新启动远程服务之前在本地启动一个简单的网络服务器,并让远程服务在准备好开始处理请求时向您的服务器发出请求。
一般来说,我会从轮询方法开始,因为它更容易并且涉及的移动部件更少。只要确保以容错方式设计轮询即可;尤其要确保指定等待的最长时间或放弃前尝试进行的轮询次数。否则,如果远程服务永远不会出现,您的脚本就会挂起。
我正在使用 LAN 唤醒在 python 脚本中启动某个服务器。
当我可以成功API请求时,服务器在线,例如:
return requests.get(
url + path,
auth=('user', user_password),
headers={'Content-Type':'application/json'},
verify=False,
timeout=0.05
).json()
等待服务器启动过程(直到可以通过 API 访问)而不用循环请求向网络发送垃圾邮件的最佳方法是什么?
我相信你非常接近。为什么不将该请求放在 while
和 try except
块中?
while True:
try:
return requests.head(...)
except requests.exceptions.ConnectionError:
time.sleep(0.5)
您的两个选择是轮询远程服务直到它响应或将服务配置为以某种方式通知您它已启动。
在循环中发送请求确实没有错,只要您不经常这样做。如果服务需要大约 10 秒才能启动,则每秒检查一次是合理的。如果大约需要 10 分钟,那么每 30 秒左右可能就可以了。
备选方案 - 某种推送通知 - 更优雅,但它需要您启动一些其他服务并且 运行 已经在侦听通知。例如,您可以在重新启动远程服务之前在本地启动一个简单的网络服务器,并让远程服务在准备好开始处理请求时向您的服务器发出请求。
一般来说,我会从轮询方法开始,因为它更容易并且涉及的移动部件更少。只要确保以容错方式设计轮询即可;尤其要确保指定等待的最长时间或放弃前尝试进行的轮询次数。否则,如果远程服务永远不会出现,您的脚本就会挂起。