запрос потока висит в питоне - PullRequest
0 голосов
/ 07 июня 2018

У меня серьезная проблема с многопроцессорным модулем Python. Я создаю инструмент управления уязвимостями.Он берет список пакетов linux, а затем ищет доступные CVE для каждого пакета, вызывая RedHat API.Я использую 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 или что-то в этом роде, и он находится в официанте.aquire ()).Любая помощь высоко ценится

1 Ответ

0 голосов
/ 13 июня 2018

Я нашел решение этой проблемы.Проблема заключалась в том, что поток еще жив, ожидая SSL-рукопожатия с сервером.То, что я сделал, это использовал многопоточность вместо пула потоков с multiprocessing.dummy.Затем используйте join () с timeout, чтобы завершить поток, когда сервер не отвечает по таймауту.

        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()
...