3

私はclient、1分に1回、複数のHTTPリクエストでドメインをマルチスレッドで呼び出すことを回避しました。基本的に、各 HTTP はクライアントで単一のスレッドにラップされます。は、接続プールを使用してソケットを管理し、再利用しますconnection classurllib3connection classをサポートしていませんasyncio

しかし、通常は長時間client(~24 時間)を実行した後、リクエストを送信するときにいくつかのエラーOSError: Too many open filesが発生することがあります。connection classそして通常、これらの例外は 100k を超える ID を持つスレッドでキャプチャされました...したがって、スレッドを操作する私の方法は完全に間違っていると思います。

サンプルコードは以下のとおりです。

def run():
  timer_start = time.time()
  workers = []
  # create several tasks in workers
  # i.e. workers.append(threading.Thread(target=foo, ...)
  run_workers(workers)
  timer = Time(timer_start - time.time() + 60, run)
  timer.start()

def run_workers(workers):
  i = 0
  while i < len(workers):
    if threading.active_count() < 8:
      workers[i].start()
      i += 1
    else:
      time.sleep(0.1)
  i = 0
  while len(workers):
    if i > len(workers):
      i = 0
    workers[i].join(timeout=0.1)
    if not workers[i].is_alive():
      del workers[i]
    i += 1

# A foo might do behavior like this
def foo(*args, **kwargs):
  res = pool.urlopen('POST', kwargs[url], kwargs[body], ...)
  if not (200 <= res.status < 300):
    #raise_error(...)    

#main()
run()

私の主な質問は、長期実行クライアントで終了したスレッドをクリーンアップするのに十分な方法ですか? python recycle はスレッド ID を使用していると思いますが、ID が 100k を超えるスレッドが実行されるのはなぜですか? それは、すでに終了したスレッドがまだそこにぶら下がっているということですか?

4

0 に答える 0