Утро доброе :) Python 3.6.
Кратко:
Есть список url сайтов. Есть цикл for, который идет по этому списку сайтов. Есть две функции: одна проверяет скорость сайта через Google Pagespeed, вторая часть GTMetrix. Идут по очереди, в каждой есть несколько sleep, для ожидания результатов проверки.
Я бы хотел запускать эти две проверки асинхронно, чтобы не ждать, образно, 2 минуты, а ждать одну, ведь API разные, и запрашивать их можно одновременно.
Примерный исходный код цикла:for item in ad_items:
site_url = 'http://'+item
#Получение статистики по скорости загрузки сайта
ad_items_dict['keyword_sites'][clear_url]['gtm_results'] = gtm_check_speed(site_url)
print('- Проверка скорости загрузки сайта завершена!')
#Получение статистики по Pagespeed
ad_items_dict['keyword_sites'][clear_url]['google_desktop_speed'] = pagespeed_request('desktop', site_url)
print('- Проверка PageSpeed для ПК завершена!')
ad_items_dict['keyword_sites'][clear_url]['google_mobile_speed'] = pagespeed_request('mobile', site_url)
print('- Проверка PageSpeed для мобильных завершена!')
Примерный код функции:#Проверка данных Google PageSpeed
async def pagespeed_request(strategy, site_url):
pagespeed_request = requests.get('https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url={0}&filter_third_party_resources=true&locale=en_US&screenshot=false&strategy={1}&key={2}'.format(site_url, strategy, PAGESPEED_API))
pagespeed_request.encoging = 'utf8'
pagespeed = json.loads(pagespeed_request.text)
await asyncio.sleep(15)
return pagespeed['ruleGroups']['SPEED']['score']
Из того, что я смог понять и прочесть, мне необходимо в начале прохода каждого for цикла создавать loop, а в конце его заканчивать, чтобы он начинался заново, когда я перехожу на следующий пункт for цикла. То есть примерно так:
for item in ad_items:
site_url = 'http://'+item
loop = asyncio.get_event_loop()
#Получение статистики по скорости загрузки сайта
ad_items_dict['keyword_sites'][clear_url]['gtm_results'] = gtm_check_speed(site_url)
print('- Проверка скорости загрузки сайта завершена!')
#Получение статистики по Pagespeed
ad_items_dict['keyword_sites'][clear_url]['google_desktop_speed'] = pagespeed_request('desktop', site_url)
print('- Проверка PageSpeed для ПК завершена!')
ad_items_dict['keyword_sites'][clear_url]['google_mobile_speed'] = pagespeed_request('mobile', site_url)
print('- Проверка PageSpeed для мобильных завершена!')
loop.close()
Все функции промечены async, все sleep заменены на await asyncio.sleep, но в таком случае я получаю ошибку
coroutine was never awaited, потому что, по логике, я так ни одну функцию и не запустил асинхронно.
Собственно, вопрос:
Если я использую что-то вроде
loop.run_until_complete(pagespeed_request('desktop', site_url)), то цикл заканчивается практически моментально. Я не до конца понимаю логику, как мне сделать так, чтобы каждая функция выполнилась асихронно сама по себе, но asyncio цикл выключился только тогда, когда отработали они все и пора переходить на новую итерацию for цикла. Как это можно реализовать? :)
Буду благодарен за любой совет. Спасибо.