python - 与请求异步,如何获得速度优势
问题描述
Async 很新,所以很抱歉现在能够非常准确地表达这个问题。
我尝试按照示例(https://pythonprogramming.net/asyncio-basics-intermediate-python-tutorial/)使用异步,希望获得多个 requests.get() 的速度优势,而不是同步方式。
import asyncio
import time
import requests
async def get_text(url):
print(f"Load {url}")
data = requests.get(url).text
await asyncio.sleep(0.0001)
print(f"Finished loading {url}")
return data
async def main(name):
tasks = [loop.create_task(get_text(n)) for n in name]
await asyncio.wait(tasks)
return tasks
if __name__ == '__main__':
url = ['https://www.nytimes.com', 'https://news.yahoo.com']
s = time.perf_counter()
loop = asyncio.get_event_loop()
result = loop.run_until_complete(main(url))
loop.close()
e = time.perf_counter() - s
print(f"Time takes: {e:0.2f}s")
但这显然与按顺序运行两个请求相同。你能指出我做错了什么以及如何正确地做以节省时间吗?我看到了另一个使用 ThreadPoolExecutor 和 loop.run_in_executor() 的示例,但我不确定如何合并它。
此致,
Ĵ
解决方案
requests
做同步 IO,所以每次调用requests.get
都会阻塞整个事件循环。如果您想要异步 IO,请使用另一个库,例如aiohttp
.
推荐阅读
- localhost - Windows 10 上的 Rapidminer 服务器故障排除
- reactjs - 在 react-redux 应用程序中创建固定导航栏
- javascript - 如何在 stencil.js/tsx 中定义全局变量?
- tensorflow - 如何将字符串编码为固定长度的张量以供 TPU 使用?
- c# - 如何将 IdentityServer4 身份验证与授权分开
- coffeescript - 使用 coffeescript eslintrc 配置 eslint
- sql - 缺少右括号 00907. 00000 - “缺少右括号”
- sql - 如何通过某个列值找到列值差异最大的行对
- vb.net - 通过频繁更新将字典绑定到 DataGridView
- java - 如果 Datasource 扩展 DelegatingDataSource,Spring boot 不会回滚测试