私はclient
、1分に1回、複数のHTTPリクエストでドメインをマルチスレッドで呼び出すことを回避しました。基本的に、各 HTTP はクライアントで単一のスレッドにラップされます。は、接続プールを使用してソケットを管理し、再利用しますconnection class
。urllib3
はconnection 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 を超えるスレッドが実行されるのはなぜですか? それは、すでに終了したスレッドがまだそこにぶら下がっているということですか?