Asyncio httpx Python/Django

Всем привет!

Есть функция, которая запускает с шаблона async функцию

def mon(request):
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    asyncio.run(deffl())
    ...

Далее

async def pp(domain):
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'ru,en-US;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        'Content-Type': 'text/plain',
        'ec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest',
    }
    async with httpx.AsyncClient(verify=False) as client:
          if domain.hash == '403':
            try:
                r = await client.get('http://' + str(domain.url))
                soup = BeautifulSoup(r.content, 'html.parser')
                title = soup.title
                print('http://' + str(domain.url), title.string)
            except Exception as es:
                print('https://' + str(domain.url), '404', es)

@sync_to_async
def get_domain_list():
    return list(Monitoring.objects.all())


async def deffl():
    queue = asyncio.Queue()
    task_list = []
    result = await get_domain_list()
    for domain in result:
        task = asyncio.create_task(pp(domain))
        task_list.append(task)
    await queue.join()
    await asyncio.gather(*task_list, return_exceptions=True)

В сущности Monitoring 3.5к доменов со статусом 403, проблема в том, что прогоняется только +- 100 доменов, остальные просто падают в except. Домены уникальные, банов на many requests не ловлю.

Если перенести например

async def deffl():
    queue = asyncio.Queue()
    task_list = []
    result = await get_domain_list()
    async with httpx.AsyncClient(verify=False) as client:
          r = await client.get('http://mail.ru')
          soup = BeautifulSoup(r.content, 'html.parser')
          title = soup.title
          print('http://mail.ru', title.string)
    ...

То он прекрасно все выведет. Идея заключается в мониторинге доменов. Синхронность конечно гуд, но каждый день ждать по 2 часа не очень впечатляет. Возможно, я что-то не так делаю, при том, что аналогичный кусок кода не в Django работает на ура.

Если у вас есть какие-то идеи, пожалуйста, напишите их. если я как-то не так объяснил, скажите, попробую еще раз объяснить другими словами.

Вернуться на верх