为了账号安全,请及时绑定邮箱和手机立即绑定

多线程Python应用程序和套接字连接的问题

多线程Python应用程序和套接字连接的问题

茅侃侃 2019-09-03 15:46:03
我正在研究在带有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个主机。
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 550 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信