// 我用的测试代码
package main
import (
"log"
"net/http"
"time"
)
type Server struct {
lock bool
}
func (s *Server) listen(port string) {
mux := http.NewServeMux()
mux.HandleFunc("/a", s.testHandler)
mux.HandleFunc("/b", s.testHandler)
mux.HandleFunc("/c", s.testHandler)
mux.HandleFunc("/d", s.testHandler)
mux.HandleFunc("/e", s.testHandler)
mux.HandleFunc("/f", s.testHandler)
mux.HandleFunc("/g", s.testHandler)
mux.HandleFunc("/h", s.testHandler)
mux.HandleFunc("/i", s.testHandler)
mux.HandleFunc("/j", s.testHandler)
http.ListenAndServe(":"+port, mux)
}
func (s *Server) testHandler(w http.ResponseWriter, r *http.Request) {
log.Println("here")
if s.lock == true {
w.Write([]byte("locked"))
log.Println("locked")
return
}
s.lock = true
time.Sleep(60 * time.Second)
s.lock = false
log.Println("unlocked")
w.Write([]byte("unlocked"))
}
func main() {
server := Server{
lock: false,
}
server.listen("8888")
}
Console 控制台测试同时打开
// console 控制台同时打开下面这组会阻塞,但是过几秒很奇怪的是后面九条是同时完成
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
// console 控制台不会阻塞
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/b");
window.open("http://127.0.0.1:8888/c");
window.open("http://127.0.0.1:8888/d");
window.open("http://127.0.0.1:8888/e");
window.open("http://127.0.0.1:8888/f");
1
geelaw 2019-03-29 06:45:44 +08:00
可能这就是学海无涯的奥义:让人难懂。
|
2
woscaizi 2019-03-29 06:48:00 +08:00 via iPhone
http 429 状态码呢?
|
3
cs8425 2019-03-29 08:38:29 +08:00 1
`s.lock == true`
你这个操作不是 atomic, 也没有上锁 在 golang, 每个 http request 是一个 goroutine, 是能并发的 有机会同时进入`time.Sleep(60 * time.Second)`这行 当然会造成 9 个卡住又同时完成 |
4
yrom 2019-03-29 08:51:29 +08:00
不是变量叫 lock 就是锁了 ==
|
5
des 2019-03-29 08:56:06 +08:00 via Android
我佛了,就不能换 post,或者加个随机参数吗?
|
6
0ZXYDDu796nVCFxq 2019-03-29 09:01:46 +08:00 via Android 2
同时暴露了 golang,HTTP 协议,浏览器三者都不熟
|
7
AngryPanda 2019-03-29 09:08:52 +08:00 via Android
OMG
|
8
Zzdex 2019-03-29 09:34:37 +08:00
第一次见这样上锁的。。。
|
9
ooh OP |
10
est 2019-03-29 10:23:07 +08:00
控制变量,用 nginx 先试试。
|
11
runze 2019-03-29 10:28:42 +08:00
|
12
ooh OP @est 已经抓包测试了,是浏览器控制了访问顺序,第一个请求发出如果服务器没返回,就会阻塞后面的请求,查过有的说是缓存策略,但是我禁止缓存,还是这样的,暂时没找到权威的资料,中午有空再研究看看
|
13
Zzdex 2019-03-29 11:11:45 +08:00
试了下,先不考虑锁的问题,确实是标题这样的,
同时只能对同一个 URL 提出一个请求 第二个请求会阻塞在 stalled,等待上一个请求完成 ![]( ) 把 disabled cache 打开就好了,也就是请求头中增加 `Cache-Control: no-cache` |
14
c4f36e5766583218 2019-03-29 19:15:29 +08:00
弱弱问下: 这是什么语言、
|
15
ooh OP @c4f36e5766583218 golang
|
16
q540374501 2019-08-08 16:25:59 +08:00
确实是这样的,气死我了
|