python - Windows 上的 Sanic Python,同一端点上的同步行为 - 这是预期的吗?
问题描述
琐碎的问题,可能被问了几次。我知道 Sanic 可以在 Windows 上运行(即检测到 uvloop 的缺失,但绝不会减少后备并按下)。
我的问题是,它还会在 Windows 上异步服务请求吗......?答案似乎是肯定的——毕竟它是一个异步框架。
但是,假设我有一个只是休眠的端点,即 asyncio.sleep(10) 并返回。如果我快速连续两次调用此端点 (/) - 第一个响应会在 10 秒内返回,然后才开始处理第二个请求。所以第二个请求在大约 20 秒后返回(同步行为)。
现在,如果我做了同样的事情,即在 2 个独立端点上运行请求(/i 和 /) - 它们都在请求到达后立即开始处理,第一个需要 10 秒才能响应(如预期的那样),然后第二个在第一个(异步行为)之后立即返回。
我有点期待请求处理程序的异步任务被转移到事件循环中,因此即使在快速连续两次调用同一端点时也具有相同的异步行为。
我在这里错过了什么吗?
from sanic import Sanic
from sanic.response import json
import asyncio
app = Sanic("X")
@app.route("/")
async def test(request):
print("request rcvd")
await asyncio.sleep(10)
return json({"hello": "world"})
@app.route("/i")
async def test(request):
print("request /i rcvd")
await asyncio.sleep(10)
return json({"hello": "i"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
解决方案
如果我快速连续两次调用此端点 (/) - 第一个响应在 10 秒内返回,然后才开始处理第二个请求
我试过你的代码,恐怕无法重现这种行为。对我来说,这两个请求都立即启动,并且都在 10 秒后返回了结果。
为了更容易验证,我稍微修改了您的代码并添加了客户端脚本:
服务器.py
from sanic import Sanic
from sanic.response import json
import asyncio
from datetime import datetime
app = Sanic("X")
@app.route("/")
async def test(request):
print("request rcvd")
await asyncio.sleep(10)
return json({"/": str(datetime.now())})
@app.route("/i")
async def test(request):
print("request /i rcvd")
await asyncio.sleep(10)
return json({"/i": str(datetime.now())})
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8000)
客户端.py
import asyncio
import aiohttp
from datetime import datetime
async def get(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
print(f'Started: {datetime.now()}')
results = await asyncio.gather(
get('http://127.0.0.1:8000/'),
get('http://127.0.0.1:8000/'),
)
print(f'Finished: {results}')
asyncio.run(main())
结果:
Started: 2020-02-02 16:50:29.087871
Finished: ['{"/":"2020-02-02 16:50:41.137824"}', '{"/":"2020-02-02 16:50:41.137824"}']
当我通过浏览器手动检查所有内容时,我也得到了预期的行为(同一端点上的请求并行启动/完成)。
推荐阅读
- hadoop - Hive:如何处理包含不固定数量字段的文件?
- python - 如何解析没有根元素的 JSON 字符串?
- macos - 任何适用于 Mac 的 SVN GUI 客户端都能够比较属性更改吗?
- javascript - SVG箭头跟随线方向
- sql-server - 带有 sql 数据库的 vb.net 应用程序
- ubuntu - 如何修复 JetBrains 产品(WebStorm、IDEA)中的 Ubuntu 非拉丁键盘快捷键?
- r - xts - 根据某些条件删除行
- java - 有没有办法使用“groupingBy”为嵌套结构中的多个元素收集地图?
- javascript - 谷歌饼图 - 图像作为标签
- azure - 使用 AzureML 通过数据存储上传数据时出现 403 错误