У меня проблема с каким-то инструментом управления уязвимостями, который я разрабатываю.Я должен отправить запросы на получение удаленного 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завершил выполнение без обработки какого-либо пакета (с картой он начинает обрабатывать некоторые пакеты, а затем блокируется)