首页 > 解决方案 > 请求挂在python中的线程

问题描述

我正在构建一个漏洞管理工具,我对 python 多处理模块有一个严重的问题。它获取一个 linux 包列表,然后通过调用 RedHat API 搜索每个包的可用 CVE。我正在使用 multiprocessing.dummy 来实现线程池来完成这项工作。问题是在成功调用 API 后,我的脚本挂起/冻结,我无法调试它。这是我的一段代码

from multiprocessing.dummy import Pool as ThreadPool 

def check_vulnerability(package):
  done.append(package)
  try:
       time.sleep(1)
       headers = {'User-agent' : 'Mozilla/11.0'}
       with requests_retry_session() as s:
          s.headers.update(headers) 
          print "Processing package "+package+"=>"+str(float(len(done))/len(packages)*100)+"%"
          req = requests.get('https://access.redhat.com/labs/securitydataapi/cve.xml?package='+package, headers = headers, verify=True)
       if req.text != '':
          soup = BeautifulSoup(req.text, 'xml')
       else:
          pass
  except Exception as e:
       #print "#################################################################################"
       #print e
       #print packages"#################################################################################"
  #Some code to process req.text

def main():
   start_time = time.time()
   global packages 
   packages = fetch_packages_rpm() #list of strings ()
   p = ThreadPool(int(results.thread))
   all = p.map(check_vulnerability, packages)

在一些成功的打印之后,我的脚本挂起并且无法调试(我认为线程正在等待 ssl 握手或类似的东西,它在 waiter.aquire() 中)。任何形式的帮助都非常感谢

标签: pythonmultithreadingpython-2.7python-requestspython-multiprocessing

解决方案


我找到了解决这个问题的方法。问题是线程仍然活着,等待与服务器的 SSL 握手。我所做的是使用线程而不是线程池与 multiprocessing.dummy。然后,当服务器超时未响应时,使用带有超时的 join() 来终止线程。

        for index, package in enumerate(packages):
          t = threading.Thread(target=check_vulnerability, args=(package,))
          threads.append(t)
          t.daemon = True 
          t.start()
          t.join(0.5)
          t.isAlive()

推荐阅读