我正在研究在带有4G内存的Ubuntu机器上运行的Python应用程序的问题。该工具将用于审核服务器(我们更喜欢使用自己的工具)。它使用线程连接到许多服务器,并且许多TCP连接失败。但是,如果我在开始每个线程之间添加1秒的延迟,那么大多数连接都会成功。我用这个简单的脚本来调查可能发生的事情:#!/usr/bin/pythonimport sysimport socketimport threadingimport timeclass Scanner(threading.Thread): def __init__(self, host, port): threading.Thread.__init__(self) self.host = host self.port = port self.status = "" def run(self): self.sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sk.settimeout(20) try: self.sk.connect((self.host, self.port)) except Exception, err: self.status = str(err) else: self.status = "connected" finally: self.sk.close()def get_hostnames_list(filename): return open(filename).read().splitlines()if (__name__ == "__main__"): hostnames_file = sys.argv[1] hosts_list = get_hostnames_list(hostnames_file) threads = [] for host in hosts_list: #time.sleep(1) thread = Scanner(host, 443) threads.append(thread) thread.start() for thread in threads: thread.join() print "Host: ", thread.host, " : ", thread.status如果我在time.sleep(1)注释掉的情况下执行此操作,比方说,300个主机中的许多连接都会因超时错误而失败,而如果我将延迟时间设置为1秒,它们就不会超时。我确实试过了另一个在更强大的机器上运行的Linux发行版上的应用程序并没有那么多的连接错误?是由于内核限制吗?有没有什么可以让连接工作而不会延迟?UPDATE我还尝试了一个限制池中可用线程数的程序。通过将其减少到20,我可以使所有连接工作,但它只检查大约1个主机每秒。所以无论我尝试什么(放入睡眠(1)或限制并发线程的数量),我似乎无法每秒检查多于1个主机。
添加回答
举报
0/150
提交
取消