join()足以清理python线程吗?

时间:2015-05-27 16:20:45

标签: python multithreading python-multithreading urllib3

我已经解决了多线程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万?这是否意味着已经完成的线程仍悬挂在那里?

0 个答案:

没有答案