Приветствую всех, я пишу python программу, которая требует 1000+ cURL запросов. Он генерирует запрос cURL и получает JSON
, а затем обрабатывает его и делает это для более 1000+ URL-адресов. Если я попытаюсь сделать это обычным образом, это займет около 20 минут, но это нужно сделать за 3 минуты.
Так что после нескольких часов исследований самым эффективным решением, которое я нашел, было многопоточность в сочетании с Keep-Alive TCP подключением.
Поэтому в основном я пытаюсь получить некоторую информацию о нескольких продуктах с веб-сайта через web-scrapping
.
Следующая программа иллюстрирует ЖЕ
import requests
import json
import time
s = requests.Session()
def getInfo(productName):
# this try block tries to get information and then parse it and then display a few
# parameters about the particular product...
try:
# this is just an example URL...
URL = "www.example.com/products/"+productName
r = s.get(URL,headers)
result = json.loads(r.text)
print(result['information'])
except json.decoder.jsonDecodeError:
print("Unable to process data for " + productName)
products = [product1, product2, product3... productN]
counter = 1
mainThread = threading.current_thread()
for product in products:
# this if block checks if this is the fifth iteration of the for loop...
# if yes then change tcp connection...
if counter%5 == 0:
# wait until all other threads except the main thread are completed, cause we don't
# want to drop the connection in the middle of a request...
threads = threading.enumerate()
for thread in threads:
if thread is mainThread:
continue
thread.join()
print("Connection Switched")
# establish a new connection...
s = requests.Session()
# hold on for a sec
time.delay(1)
# start a new thread for getting info about the current 'prouct'
thread = threading.Thread(target=getInfo,args=(product,))
thread.start()
print("Done")
Обратите внимание, что код был упрощенной версией реального кода ...
В любом случае ...
Я не знаю По какой причине моя программа создает новое TCP-соединение для каждого product
. В журналах ничего особенного, только основные c вещи ...
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): www.example.com
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (2): www.example.com
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (3): www.example.com
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (4): www.example.com
...
Даже после нескольких часов поиска я не могу найти достаточно подходящего решения.
Вот некоторые из вещей, которые у меня есть TRIED
Приведенные выше две ссылки - просто связанные вопросы, поэтому в принципе я пока не пробовал какого-либо разумного решения.
Было бы очень полезно, если бы вы могли помочь мне с этой странной загадкой ...
Спасибо заранее