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