使用多个Telnet连接线程时的超时和高CPU负载问题

0 投票
1 回答
1715 浏览
提问于 2025-04-17 08:48

我想用Python的线程功能连接多个telnet主机,但遇到了一个我解决不了的问题。

我在MAC OS X Lion / Python 2.7上使用以下代码:

import threading,telnetlib,socket

class ReaderThread(threading.Thread):
    def __init__(self, ip, port): 
        threading.Thread.__init__(self)
        self.ip = ip
        self.port = port
        self.telnet_con = telnetlib.Telnet()

    def run(self):
        try:
            print 'Start %s' % self.ip
            self.telnet_con.open(self.ip,self.port,30)
            print 'Done %s' % self.ip
        except socket.timeout:
            print 'Timeout in %s' % self.ip

    def join(self):
        self.telnet_con.close()

ta = []

t1 = ReaderThread('10.0.1.162',9999)
ta.append(t1)
t2 = ReaderThread('10.0.1.163',9999)
ta.append(t2)

for t in ta:
    t.start()
print 'Threads started\n'

总体来说,这段代码是能工作的,但有一个线程(不是总是同一个)连接时会花很长时间(大约20秒,有时甚至会超时)。在这段非常漫长的连接时间里(在一个完全本地的网络中),CPU的负载也会飙升到100%。

更奇怪的是,如果我只用一个线程,连接总是非常顺利。所以这肯定和使用多个线程有关。

我已经为所有IP地址添加了主机名条目,以避免DNS查找的问题,但这并没有改变什么。

提前感谢你的帮助。

最好的祝福

senexi

1 个回答

0

好的,你重写了join()这个方法,但其实不应该这样做。主线程在代码的最后一行执行完后,会对每个线程调用join()。因为你的join()方法在telnet线程真正退出之前就返回了,所以Python就搞混了,试图再次调用join(),这就是导致CPU使用率达到100%的原因。你可以在join()方法里加一个'print'语句,看看发生了什么。

你实现的join()方法试图关闭连接(可能是在另一个线程还在尝试打开连接的时候),这可能就是导致你的telnet线程一直无法完成的原因。

撰写回答