簡體   English   中英

Python:無法建立連接,因為目標機器主動拒絕它

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM