1

私はマルチスレッドPythonプログラムを持っていますが、ローカルURL(http://testing.com/sendMessages_mock.php)との接続を継続して開き、WAMPをインストールしてsendMessages_mock.phpテスト目的のためにローカルのファイル。時々、私は「接続していません[errnoが10061]対象のコンピュータによって拒否されたため、」を取得Python:ターゲットマシンが積極的にそれを拒否したため、接続できませんでした

を各スレッドには、この関数を呼び出します。 1秒ごとに、この関数を呼び出す数百のスレッドがあります。いくつかのスレッド呼び出しに対してのみこの例外を取得します。これについての考えは?

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'コールにはまだ受け入れられていない受信接続要求の最大数であるバックログがあります。その要求キューが大きすぎると、サーバーの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

これがうまくいくとすれば、[decorator](http://python-3-patterns-idioms-test.readthedocs.io/en/latest/PythonDecorators.html#function-decorators)のようにもっとうまくいくでしょう。この場合、コンストラクタをラップする関数を受け入れ、 'call'は' __call__'に置き換えられます。 – Tagc

関連する問題