Python Asyncio不能并行运行
我正在运行这个异步IO示例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
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()
期间。