Как использовать aiohttp с ThreadPoolExecutor? - PullRequest
0 голосов
/ 20 июня 2019

Теперь у меня есть этот код:

def parse_url(i):
    url = f"https://www.python.org/dev/peps/pep-{i}/"
    print(f"Started {str(i)}")
    r = requests.get(url)
    print(f"Ended {str(i)}")
    return r.content


async def get_urls(executor):
    loop = asyncio.get_event_loop()
    tasks = [
        loop.run_in_executor(executor, parse_url, i)
        for i in range(8001, 8033)
    ]
    await asyncio.wait(tasks)


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    executor = ThreadPoolExecutor(max_workers=2)
    s = time.perf_counter()
    loop.run_until_complete(
        get_urls(executor)
    )
    loop.close() 

Теперь работа разбита на 2 потока, но каждый поток выполняет запрос последовательно, я хочу стандартное асинхронное поведение в каждом потоке с aiohttp:

  1. Запустить запрос
  2. В ожидании данных откройте другой запрос
  3. Получить результат запроса

loop.run_in_executor не позволяет передавать сопрограммы в качестве параметра, как я могу достичь своего желания?

...