отправка запросов с помощью asyncio одновременно на определенный URL, получение первого полного ответа и завершение оставшихся ожидающих запросов - PullRequest
0 голосов
/ 28 сентября 2019

Я новичок в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...