0

我想在 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 查找问题。这并没有什么不同。

在此先感谢您的帮助。

最好的祝福

森西

4

1 回答 1

0

好的,你已经覆盖了 join(),你不应该这样做。当主线程完成时,主线程在每个线程上调用 join() ,就在代码的最后一行之后。由于您的 join() 方法在您的 telnet 线程实际退出之前返回,Python 会感到困惑并尝试再次调用 join(),这就是导致 100% cpu 使用率的原因。尝试在您的 join() 方法中添加“打印”语句。

您的 join() 实现尝试关闭套接字(可能在另一个线程仍在尝试打开连接时),这可能是导致您的 telnet 线程永远无法完成的原因。

于 2011-12-21T21:52:50.543 回答