python中使用多个telnet连接线程的超时和高cpu负载问题

2024-09-28 17:03:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python中的线程连接到多个telnet主机,但是我遇到了一个我无法解决的问题。在

在MAC操作系统上使用Python和Lion代码

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查找问题。这没什么区别。在

提前谢谢你的帮助。在

谨致问候

塞内西


Tags: selfipinitportdefsocket线程con
1条回答
网友
1楼 · 发布于 2024-09-28 17:03:09

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

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

相关问题 更多 >