1
ksc010 OP 还有一个情况就是
requests 请求 nginx 正常 浏览器请求 flask 正常 |
2
privatezcoding 2019-12-26 11:04:58 +08:00 1
你电脑是不是开了代理
|
3
ksc010 OP @privatezcoding 对 但是不是系统代理 需要显示的指定端口
|
4
wuwukai007 2019-12-26 11:20:50 +08:00 1
打个断点看下 flask 接受请求的事件是不是延迟了,用 urllib 和 curl 都请求下试试呢
|
5
gwy15 2019-12-26 11:27:10 +08:00 via Android 1
我上次写单元测试也遇到这个问题,后来发现是 DNS 花了 2s。楼主换成裸 ip 试试
|
6
ksc010 OP @wuwukai007
curl 和浏览器一样 没有延迟 requests 就不行 requests.get('http://localhost:8080',timeout=2).text 就这一行代码 明显感觉延迟了 -------------------- flask 启动参数 app.run(port=self.port, host=self.host, threaded=True) |
7
lenqu 2019-12-26 11:28:05 +08:00 1
或者 f12 查看一下开发工具里统计的延迟
|
11
smallpython 2019-12-26 11:39:57 +08:00
把 localhost 转换为 127.0.0.1 这件事情是谁做的?为什么会有两秒的延迟
|
12
ksc010 OP @gwy15 之所以没往 dns 这方面想
是因为记得 请求内网服务器上的接口也是慢(通过内网 ip 10.1.1.22:8080 ) 然后一直测试本地的接口(通过 localhost:8080 ) 在你说直接使用 ip 之后 又测试了下内网服务器接口 发现速度正常了(这个可能是其他的问题引起的 但是现在没有复现) 总之非常感谢 |
13
wybhdxfx 2019-12-26 12:06:26 +08:00
学习了,平常我也习惯用 127.0.0.1,少用 localhost。
|
14
ClericPy 2019-12-26 13:36:31 +08:00
看标题没看懂... 看到最后才知道说的是啥...
也不知道什么时候开始, Windows10 和 macOS 默认的 hosts 里都有一句 ipv6 版本的 localhost, 不确定是自带的还是被什么改的 |
15
gwy15 2019-12-26 13:45:48 +08:00 3
我跟踪了一下,跟踪到了
`urllib3.util.connection.create_connection` 这个函数里面。 这个函数做的是根据 host 和 port 建立 socket 连接。当使用 localhost 的时候,会调用 `for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM)` 这样一个循环。对于 `localhost`,会返回两个结果: + ::1 (ipv6 下的 localhost) + 127.0.0.1 (ipv4 下的 localhost) 根据循环,会首先尝试连接 `::1`,而如果 flask 使用的是默认的 host 或是 0.0.0.0,只会监听 ipv4 的请求,因此 ipv6 会抛出 NewConnectionError,而后继续尝试 ipv4 的请求。这就是两秒延迟的原因。 解决方法: + 使用 app.run(host='::') 调试,使 flask 监听 ipv6,这样第一个尝试的 `::1` 也可以正常连接。 + 使用 requests.get('127.0.0.1'), 避免 DNS 解析。 |
17
deplives 2019-12-29 17:09:08 +08:00
很早之前在 sof 上我就看到一个问题大概类似,底下回答基本上都是不要用 localhost 虽然那个问题我没遇到过,但从那之后我也不用 localhost 了
|
18
ksc010 OP 一年后又遇到相同的问题,翻了下这个帖子想起来原因了
|