Я пытаюсь получить несколько сайтов асинхронно с Semaphore, включая предотвращение исключений тайм-аута при рендеринге страниц (установлено на 5).
Я тестировал программу на нескольких страницах в pages
список, который вернул результаты, как и ожидалось, однако при добавлении страниц программа начинает работать с ошибкой из-за исключения таймаута во время операции рендерингаПоэтому я решил добавить семафор в программу.
async def get_page(assesion, page, semaphore):
async with semaphore:
logging.info(f"Processing page: {page}")
response = await assesion.get(prop)
try:
await response.html.arender(timeout=3000)
except:
response = None
return response
async def main(pages):
asession = requests_html.AsyncHTMLSession()
semaphore = asyncio.Semaphore(5)
tasks = [asyncio.ensure_future(get_property(asession, page, semaphore)) for page in pages]
return await asyncio.gather(*tasks)
loop = asyncio.get_event_loop()
loop.set_debug(True)
results = loop.run_until_complete(main(pages))
print(results)
В текущем состоянии программа берет первые 5 страниц из списка pages
, открывает их в хроме и после этого Processing page: ...
отображается для других страниц изpages
список (без отображения логов для открытия страниц). В конце [I:pyppeteer.connection] connection closed
пять раз (вероятно, для закрытия первых пяти страниц).