猿问

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

我正在研究在带有4G内存的Ubuntu机器上运行的Python应用程序的问题。该工具将用于审核服务器(我们更喜欢使用自己的工具)。它使用线程连接到许多服务器,并且许多TCP连接失败。但是,如果我在开始每个线程之间添加1秒的延迟,那么大多数连接都会成功。我用这个简单的脚本来调查可能发生的事情:


#!/usr/bin/python


import sys

import socket

import threading

import time


class 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个主机。




茅侃侃
浏览 551回答 3
3回答
随时随地看视频慕课网APP

相关分类

Python
我要回答