Я запускаю этот пример asyncio
import asyncio
from aiohttp import ClientSession
async def fetch(url, session, index):
async with session.get(url) as response:
print("Before " + str(index))
buffer = await response.read()
print("After " + str(index))
async def run(r):
url = "http://google.com"
tasks = []
# Fetch all responses within one Client session,
# keep connection alive for all requests.
async with ClientSession() as session:
for i in range(r):
task = asyncio.ensure_future(fetch(url, session, i))
tasks.append(task)
responses = await asyncio.gather(*tasks)
# you now have all response bodies in this variable
print(responses)
def print_responses(result):
print(result)
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run(4))
loop.run_until_complete(future)
Результаты примерно такие
Before 1
After 1
Before 3
After 3
Before 2
After 2
Before 0
After 0
Похоже, что вещи работают серийно. Сама часть выборки занимает несколько миллисекунд. Я запускал его несколько раз, но результаты не совпадают. Какие-либо предложения?






Как упоминалось в комментариях, вполне вероятно, что к моменту вызова response.read() больше нечего загружать, сопрограмма не приостанавливается, а затем немедленно вызывается print("After " + str(index)).
Чтобы увидеть больше смешения, вы можете выбрать более медленный URL. Например для меня
url = "http://speedtest.tele2.net/100MB.zip"
выходы
Before 0
Before 1
Before 3
Before 2
After 0
After 1
After 2
After 3
Попробуйте переместить
print("Before")доsession.get(). Если тело ответа прибывает в том же пакете, что и заголовки,response.read()не будет блокироваться и, следовательно, не будет причин для приостановки сопрограммы. Это дает вам видимость того, что все работает последовательно, хотя на самом деле параллелизм имел место во времяget().