Я новичок в asyncio / await и хочу отправлять параллельные запросы на определенный URL.Я должен получить первый "готовый" результат ответа и отменить все оставшиеся ожидающие ответы.после этого я должен прочитать текст HTTP-страницы и использовать beautifulsoup для удаления нужных данных.
Из разных возможных библиотек я выбрал asyncio.Прочитав документы, я нашел две концепции, связанные с моей целью:
first :
asyncio.wait(aws, *, loop=None, timeout=None, return_when=FIRST_COMPLETED)
second :
используя loop.run_forever() and loop.stop()
для управления условиями.
окончательная программа выглядит следующим образом:
import asyncio
import concurrent.futures
import requests
async def foo():
url = 'http://example.org/'
req_number = 5
with concurrent.futures.ThreadPoolExecutor(max_workers=req_number) as executor:
f = loop.run_in_executor(executor, requests.get, url)
return f
async def main():
req_number = 5
task = [foo() for i in range(req_number)]
print(task)
done, pending = await asyncio.wait(task, return_when=asyncio.FIRST_COMPLETED)
for i in done:
print(i.result())
loop.stop()
return task
loop = asyncio.get_event_loop()
loop.create_task(main())
rr = loop.run_forever()
print(rr)
loop.close()