запросы Python с многопроцессорностью - PullRequest
0 голосов
/ 01 июня 2018

У меня проблема с каким-то инструментом управления уязвимостями, который я разрабатываю.Я должен отправить запросы на получение удаленного API.Я использую многопроцессорность для выполнения параллельных вычислений.Проблема в том, что выполнение скрипта никогда не прекращается.Он выполняет некоторые запросы, затем блокируется.Вот фрагмент моего кода

import requests
from multiprocess import Pool

def check_vulnerability(package):
  req = ''
  while req == '':
     try:
       headers = {'User-agent' : 'Mozilla/11.0'}
       time.sleep(0.3)
       req = requests.get('https://access.redhat.com/labs/securitydataapi/cve.xml?package='+package, headers = headers)
       break
     except:
       print "Retrying . . ."
       #time.sleep(0.3)
       continue
  soup = BeautifulSoup(req.text, 'xml')
  #some code to process soup and print partial results

def main():
  start_time = time.time()
  packages = fetch_packages()  #list of strings
  p = Pool(int(results.thread)) #from argv
  all = p.map(check_vulnerability, packages)
  print( "\n"+"Finished in : " + str( int( time.time() - start_time ) ) + "s")

if __name__=="__main__":
  main()

При выполнении этого он печатает много строк (частичные результаты), но никогда не завершает выполнение.Он печатает повторную попытку, когда я нажимаю Ctrl + C, что означает, что он заблокирован при отправке запроса.Затем выводится следующая трассировка

Traceback (most recent call last):
 File "/home/user/.local/lib/python2.7/site- 
 packages/multiprocess/process.py", line 258, in _bootstrap
 self.run()
 File "/home/user/.local/lib/python2.7/site- 
 packages/multiprocess/process.py", line 114, in run
 self._target(*self._args, **self._kwargs)
 File "/home/user/.local/lib/python2.7/site- 
 packages/multiprocess/pool.py", line 102, in worker
 task = get()
 File "/home/user/.local/lib/python2.7/site- 
 packages/multiprocess/queues.py", line 379, in get
 racquire()
 KeyboardInterrupt

. Я думаю, что проблема в том, что я пытался отправить много запросов на удаленный сервер.Что мне делать ?любая помощь приветствуется.Спасибо

РЕДАКТИРОВАТЬ 1 Я удалил цикл while и попытался поймать исключение Это

HTTPSConnectionPool(host='access.redhat.com', port=443): Max retries exceeded with url: /labs/securitydataapi/cve.xml?package=librelp-1.2.0-3.el7.i686 (Caused by SSLError(SSLError("bad handshake: SysCallError(-1, 'Unexpected EOF')",),))

Я пытался с Session (), но та же проблема

РЕДАКТИРОВАТЬ 2 IЯ думаю, что проблема в моем файле p.map, так как я заблокировал потоки. Я хочу, чтобы мой сценарий продолжал выполняться, даже если есть заблокированные потоки, или я не хочу, чтобы какой-либо поток блокировался (обычно ожидает ssl_handshake) Когда я пытался использовать imapзавершил выполнение без обработки какого-либо пакета (с картой он начинает обрабатывать некоторые пакеты, а затем блокируется)

1 Ответ

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

Что касается вашей проблемы при многопроцессорной обработке, попробуйте следующее:

from multiprocessing.dummy import Pool as ThreadPool 

pool = ThreadPool(10) # say
all = pool.map(check_vulnerability, packages)

В этих пакетах произошли некоторые изменения.Что касается вашей проблемы с SSL, если вы не заинтересованы в проверке сертификатов, вы можете передать в свой запрос аргумент verify = False.get

req = requests.get('https://access.redhat.com/labs/securitydataapi/cve.xml?package='+package, headers = headers, verify=False)
...