我已经解决了多线程client
每分钟调用一次带有多个HTTP请求的域的问题。基本上每个HTTP都包含在客户端的单个线程中。 connection class
使用urllib3
和连接池来管理套接字并重用它们。 connection class
不支持asyncio
。
但有时,通常在经过client
(~24小时)很长一段时间后,在发送请求时OSError: Too many open files
会引发一些connection class
。通常这些异常是在id大于100k的线程中捕获的......所以我认为我操纵线程的方式是完全错误的。
示例代码如下所示。
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回收使用了线程ID,但为什么我仍然会得到一个运行id&gt;的线程10万?这是否意味着已经完成的线程仍悬挂在那里?