为什么 aiohttp 比 gevent 慢得可怕?
Why is aiohttp horribly slower than gevent?
免责声明:我是 aiohttp 的初学者
我正在尝试使用 aiohttp 异步处理 get 请求,但事实证明它比 gevent 的池版本慢得多。
GEVENT 版本
import gevent
from gevent import monkey
monkey.patch_all()
from gevent.pool import Pool
import requests
import time
def pooling_task(url):
requests.get(url)
def pooling_main():
start = time.time()
pool = Pool(10)
urls = [
"http://google.com",
"http://yahoo.com",
"http://linkedin.com",
"http://shutterfly.com",
"http://mypublisher.com",
"http://facebook.com"
]
for url in urls:
pool.apply_async(pooling_task, args=(url,))
pool.join()
end = time.time()
print("POOL TIME {}".format(end-start))
if __name__ == '__main__':
print("POOLING VERSION")
pooling_main()
输出 - 泳池时间 6.299163818359375
以下是aiohttp版本
import aiohttp
import asyncio
import time
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
"http://google.com",
"http://yahoo.com",
"http://linkedin.com",
"http://shutterfly.com",
"http://mypublisher.com",
"http://facebook.com"]
async with aiohttp.ClientSession() as session:
for url in urls:
await fetch(session, url)
if __name__ == "__main__":
start = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
end = time.time()
print("Time taken {}".format(end - start))
输出 - 所用时间 15.399710178375244
我真的不明白为什么aiohttp这么慢。
至于 gevent 版本 requests.get 仍然是一个阻塞调用,但不是 aiohttp.
我希望 aiohttp 版本更快。
for url in urls:
await fetch(session, url)
await
这里的意思是你不在上一个完成之前开始下一个 url 下载。要使所有下载并发,您应该使用 asyncio.gather.
之类的东西
像这样修改您的代码:
async with aiohttp.ClientSession() as session:
await asyncio.gather(*[
fetch(session, url)
for url
in urls
])
你会看到巨大的加速。
免责声明:我是 aiohttp 的初学者
我正在尝试使用 aiohttp 异步处理 get 请求,但事实证明它比 gevent 的池版本慢得多。
GEVENT 版本
import gevent
from gevent import monkey
monkey.patch_all()
from gevent.pool import Pool
import requests
import time
def pooling_task(url):
requests.get(url)
def pooling_main():
start = time.time()
pool = Pool(10)
urls = [
"http://google.com",
"http://yahoo.com",
"http://linkedin.com",
"http://shutterfly.com",
"http://mypublisher.com",
"http://facebook.com"
]
for url in urls:
pool.apply_async(pooling_task, args=(url,))
pool.join()
end = time.time()
print("POOL TIME {}".format(end-start))
if __name__ == '__main__':
print("POOLING VERSION")
pooling_main()
输出 - 泳池时间 6.299163818359375
以下是aiohttp版本
import aiohttp
import asyncio
import time
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
"http://google.com",
"http://yahoo.com",
"http://linkedin.com",
"http://shutterfly.com",
"http://mypublisher.com",
"http://facebook.com"]
async with aiohttp.ClientSession() as session:
for url in urls:
await fetch(session, url)
if __name__ == "__main__":
start = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
end = time.time()
print("Time taken {}".format(end - start))
输出 - 所用时间 15.399710178375244
我真的不明白为什么aiohttp这么慢。 至于 gevent 版本 requests.get 仍然是一个阻塞调用,但不是 aiohttp.
我希望 aiohttp 版本更快。
for url in urls:
await fetch(session, url)
await
这里的意思是你不在上一个完成之前开始下一个 url 下载。要使所有下载并发,您应该使用 asyncio.gather.
像这样修改您的代码:
async with aiohttp.ClientSession() as session:
await asyncio.gather(*[
fetch(session, url)
for url
in urls
])
你会看到巨大的加速。