![](/img/trans.png)
[英]Python - No connection could be made because the target machine actively refused it
[英]Python: No connection could be made because the target machine actively refused it
我有一个多线程 python 程序,它会持续打开与本地 URL( http://testing.com/sendMessages_mock.php )的连接,我已经安装了 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 端解决此问题,则可以编写限制器类来处理 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()
通过此类进行调用将有效地限制请求,因此服务器将能够处理它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.