1

我有一个多线程的python程序,它会连续打开本地URL的连接(),我已经安装了WAMP并具有sendMessages_mock.php文件在本地进行测试。有时,我得到“[Errno 10061]由于目标机器主动拒绝,所以无法连接”Python:无法建立连接,因为目标机器主动拒绝它

每个线程都会调用此函数。每一秒钟,就会有数百个线程调用这个函数。只为少数线程调用获取此异常。对此有何想法?

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())) 
+3

服务器端监听连接,但“listen”调用有backlog - 最大数量的尚未被接受的传入连接请求。当请求队列太大时,服务器TCP堆栈可能会开始拒绝连接。这可能是你所看到的。您可能可以将服务器配置为更大的待办事项,但也可以考虑这是正常的背压,可以让您的客户冷静一点。 – tdelaney

回答

1

如果每秒太多调用导致WAMP拒绝请求的问题,你想解决这个Python的一面,你可以写限制类,它会处理的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() 

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

+0

假设这可行,它可能会更好[装饰](http://python-3-patterns-idioms-test.readthedocs.io/en/latest/PythonDecorators.html#function-decorators)。在这种情况下,它会接受包装在其构造函数中的函数,并且'call'将被'__call__'替换。 – Tagc

相关问题