Семафор Асинсио застрял после первой волны - PullRequest
0 голосов
/ 10 ноября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...