我正在编写一个简单的脚本来检查 SSH 连接,但我无法理解为什么它卡在一个线程上。
class myThread(threading.Thread):
def __init__(self, hostname ):
threading.Thread.__init__(self)
self.hostname = hostname
def run(self):
return self.doSSH(self.hostname)
def doSSH(self,hostname):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((hostname, 22))
result = s.recv(1024)
if re.findall(r'^SSH.+?SSH.+',result) :
return "Up"
else :
return "Down"
def main():
q = Queue.Queue()
completeHostlist = ["host1","host2","google.com","host3"]
for hostname in completeHostlist:
thread = myThread(hostname)
thread.daemon = True
q.put_nowait(thread.run())
q.get_nowait()
我不明白为什么这个脚本在 google.com 上挂起?我希望它生成守护线程并继续使用 host3。一旦完成 host3,它就必须终止与 Google 的线程并返回结果。我做错了什么?
我已经了解了 run() 和 start()。无论如何,这没有按预期工作,在所有 host[1-3] 线程启动后,脚本卡在 google 线程上,等待它结束。应该在脚本末尾杀死它吗?
我应该使用多处理而不是多线程来为每个主机生成单独的进程吗?
最佳答案
在您的代码中,您执行q.put_nowait(thread.run())
。这会立即在当前线程上运行 ssh 。您需要调用线程特定的方法来启动线程。您需要调用thread.start()
。
不确定您正在使用队列做什么。
关于 python : threads do not work properly in daemon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20404226/