Python:无法建立连接,因为目标计算机主动拒绝了它

Python:无法建立连接,因为目标计算机主动拒绝了它,python,multithreading,python-2.7,python-multithreading,urlopen,Python,Multithreading,Python 2.7,Python Multithreading,Urlopen,我有一个多线程python程序,它将持续打开与本地URL的连接(),我已经安装了WAMP,并在本地有sendMessages_mock.php文件用于测试。有时,我得到“[Errno 10061]无法建立连接,因为目标计算机主动拒绝它” 每个线程都将调用此函数。每隔一秒钟,就会有数百个线程调用这个函数。仅为少数线程调用获取此异常。有什么想法吗 def sendMessage(body): try: request = Request(url="http://testing

我有一个多线程python程序,它将持续打开与本地URL的连接(),我已经安装了WAMP,并在本地有sendMessages_mock.php文件用于测试。有时,我得到“[Errno 10061]无法建立连接,因为目标计算机主动拒绝它”

每个线程都将调用此函数。每隔一秒钟,就会有数百个线程调用这个函数。仅为少数线程调用获取此异常。有什么想法吗

def sendMessage(body):
    try:
        request = Request(url="http://testing.com/sendMessages_mock.php", data=json.dumps(body))
        request.add_header('Authorization', 'key=' + CONST.API_KEY)
        request.add_header('Content-Type', 'application/json')
        response = urlopen(request)
        responseData = response.read().decode('utf-8')

    except Exception as exceptionErr:
        print("Oops! " + str(traceback.format_exc()))

如果每秒调用过多是一个导致WAMP拒绝请求的问题,并且您希望在Python端解决这个问题,那么您可以编写limiter类来处理sendMessage执行并限制调用数量

请注意,这是我对其他人问题的第一个回答,所以可能是完全错误的。请保持合理的怀疑态度

#python 2.7
import threading

class Throttle(object):
    def __init__(self, call_limit, interval):
        self.call_limit = call_limit
        self.interval = interval
        self.cleaner = None
        self.buffer = threading.Semaphore(call_limit)
        self.calls_in_buffer = 0

    def call(self, function, *args):
        self.buffer.acquire()

        self.calls_in_buffer += 1
        try:
            return function(*args)
        except:
            raise
        finally:
            if self.cleaner == None:
                self._init_cleaner()

    def _drain(self):
        for i in range(self.call_limit):
            self.calls_in_buffer -= 1
            self.buffer.release()
        self.cleaner = None

    def _init_cleaner(self):
        self.cleaner = threading.Timer(self.interval, self._drain)
        self.cleaner.daemon = True
        self.cleaner.start()

通过这样的类进行调用将有效地限制请求,因此服务器将能够处理它们。

服务器端侦听连接,但
侦听
调用有一个待办事项-尚未接受的最大传入连接请求数。当该请求队列太大时,服务器TCP堆栈可能会开始拒绝连接。这可能就是你所看到的。你可能会把服务器配置成一个更大的积压,但也可以认为这是正常的背压,告诉你的客户有点冷。假设这是可行的,它可能会更好。在这种情况下,它将接受包装在其构造函数中的函数,
call
将替换为
\uuuu call\uuu