最近对比了各种 ASGI 服务器,发现当前的几个 ASGI 服务器中 ,hypercorn 的完成度是最高的,http 支持到 3,ASGI 扩展也支持了两个,可惜 Zero Copy Send 目前还没支持,当时就想对他加入这个的支持,如果成功,这也是第一个支持全部 ASGI 扩展的 ASGI 服务器,然而 hypercorn 原作者似乎最近没空,我就自己 fork 了个,主要代码在这,https://gitlab.com/synodriver/hypercorn/-/blob/zerocopy/src/hypercorn/asyncio/tcp_server.py#L106, 但是测试中发生了问题,在 debian 上 Errno32 Brokenpipe,在 win 上客户端也是收不到数据,似乎一旦调用 loop.sendfile,对面就关闭了连接。有对 ASGI 协议和服务器有研究的大佬可以帮忙看看吗?
这是我用的测试 code
async def app2(scope, receive, send):
if scope["type"] == "http" and scope["path"] == "/":
await send({"type": "http.response.start", "status": 200,
"headers": [(b"Content-Type", b"image/png"), (b"Cache-Control", b"no-cache")]})
f = open(r"test.jpg", "rb")
await send({"type": "http.response.zerocopysend", "file": f.fileno()})
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.