我有一个脚本通过wmi连接到很多主机:
wmi.WMI(ip, user=username, password=password))
但是,通常许多主机都不可用,并且在允许脚本尝试下一个主机之前连接暂定需要很长时间。
我希望能够在尝试连接之前测试远程主机的可用性,或者能够为连接设置超时。
有什么想法吗?
答案 0 :(得分:1)
您遇到网络超时,其时间深深地埋藏在Windows注册表(网络堆栈)中。
您的问题有很多可能的解决方案,我的(除了使用多个线程)引入自定义超时(例如5秒而不是75默认秒)
有趣的是,Windows PowerShell wmi对象确实引入了一个开箱即用的超时选项,而python一个没有。因此,解决问题的一种方法是实现自己的超时。在python中,一种方法是这样的:
https://pythonadventures.wordpress.com/2012/12/08/raise-a-timeout-exception-after-x-seconds/
import signal
import time
def test_request(arg=None):
"""Your http request."""
time.sleep(2)
return arg
class Timeout():
"""Timeout class using ALARM signal."""
class Timeout(Exception):
pass
def __init__(self, sec):
self.sec = sec
def __enter__(self):
signal.signal(signal.SIGALRM, self.raise_timeout)
signal.alarm(self.sec)
def __exit__(self, *args):
signal.alarm(0) # disable alarm
def raise_timeout(self, *args):
raise Timeout.Timeout()
def main():
# Run block of code with timeouts
try:
with Timeout(3):
print test_request("Request 1")
with Timeout(1):
print test_request("Request 2")
except Timeout.Timeout:
print "Timeout"
#############################################################################
if __name__ == "__main__":
main()