请求在python

时间:2018-06-07 09:45:06

标签: python multithreading python-2.7 python-requests python-multiprocessing

我对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())。任何形式的帮助都非常感谢

1 个答案:

答案 0 :(得分:0)

我找到了解决此问题的方法。 问题在于线程仍处于活动状态,等待与服务器的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()