Python Asyncio不能并行运行

Python Asyncio不能并行运行,python,concurrency,python-asyncio,aiohttp,Python,Concurrency,Python Asyncio,Aiohttp,我正在运行这个异步IO示例 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 " + s

我正在运行这个异步IO示例

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(“在”+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()
期间。