我想在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
答案 0 :(得分:0)
好的,你已经覆盖了join(),你不应该这样做。当主线程完成时,主线程在每个线程上调用join(),这是在代码的最后一行之后。由于你的join()方法在你的telnet线程实际退出之前返回,Python会感到困惑,并试图再次调用join(),这就是导致100%cpu使用的原因。尝试在join()方法中加上'print'语句。
您的join()实现尝试关闭套接字(可能在另一个线程仍在尝试打开连接时),这可能是导致您的telnet线程永远不会完成的原因。