ThreadPoolExecutor + Requests == deadlock?

时间:2016-11-30 14:57:45

标签: python request threadpoolexecutor concurrent.futures

我有一个很小的愚蠢的代码,它向google搜索服务发出了很多请求

from concurrent.futures import ThreadPoolExecutor
import requests

import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()


def check(page):
  r = requests.get('https://www.google.ru/#q=test&start={}'.format(page * 10))
  return len(r.text)

import time

def main():
  for q in xrange(30):
    st_t = time.time()
    with ThreadPoolExecutor(20) as pool:
      ret = [x for x in pool.map(check, xrange(1,1000))]
      print time.time() - st_t

if __name__ == "__main__":
  main()

它首先起作用,但后来出了问题。所有20个线程都存活,但后来它们什么也没做。我可以在htop看到他们还活着,但实际上我不明白为什么没有发生。

任何想法可能出错?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

这是一个已知问题,请求团队未获得足够的调试信息,请参见this。可能是CPython问题,请参见this