Время асинхронных HTTP-запросов с использованием asyncio и timeit - PullRequest
0 голосов
/ 30 августа 2018

Я нашел этот фрагмент кода из блога shipperkongen о том, как отправлять параллельные запросы с использованием asyncio. Я добавил timeit для расчета времени, используемого для запросов. Тем не менее, кажется, что ожидание завершения всех запросов, прежде чем приступить к вычислению необходимого времени.

Я хотел бы знать, как получить время между параллельным отправленным запросом и первым ответом. Как мне изменить код для достижения этой цели? Спасибо

Обратите внимание, что я добавил в строки timeit и использую Python3.6

import asyncio
import concurrent.futures
import requests
import timeit

async def main():

    with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
        loop = asyncio.get_event_loop()
        start = timeit.default_timer()
        futures = [
            loop.run_in_executor(
                executor, 
                requests.get, 
                'http://example.org/'
            )
            for i in range(20)
        ]
        for response in await asyncio.gather(*futures):
            stop = timeit.default_timer()
            pass
        elapsed = stop - start
        print(elapsed)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Я получил сообщение об ошибке «Возврат» со значением в асинхронном генераторе », когда я попытался с asyncio.as_completed(futures)

import asyncio
import concurrent.futures
import requests
import timeit

async def main():

    with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
        loop = asyncio.get_event_loop()
        start = timeit.default_timer()
        futures = [
            loop.run_in_executor(
                executor, 
                requests.get, 
                'http://example.org/'
            )
            for i in range(20)
        ]
        for resp in asyncio.as_completed(futures):
            res = yield resp
            print(res.status_code)
            stop = timeit.default_timer()
            elapsed = stop - start
            print(elapsed)
            return elapsed

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
...