почему go mux блокируется с time.sleep при вызове из того же браузера? - PullRequest
0 голосов
/ 22 февраля 2020

Вот мой код:

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func gotest(w http.ResponseWriter, req *http.Request) {
    log.Printf("starting ... Go Test()")
    for i := 0; i < 10; i++ {
        time.Sleep(2 * time.Second)
        log.Printf("Go Test %s", i)
        fmt.Fprintf(w, "Go Test %s", i)
    }
}

func main() {
    http.HandleFunc("/gotest", gotest)
    http.ListenAndServe(":3016", nil)
}

Выполнение http://localhost: 3016 / gotest несколько windows с использованием одного и того же браузера приводит к тому, что функция gotest выполняет последовательный (не одновременный)

2020/02/22 01:24:26 starting ... Go Test()
2020/02/22 01:24:28 Go Test %!s(int=0)
2020/02/22 01:24:30 Go Test %!s(int=1)
2020/02/22 01:24:32 Go Test %!s(int=2)
2020/02/22 01:24:34 Go Test %!s(int=3)
2020/02/22 01:24:36 Go Test %!s(int=4)
2020/02/22 01:24:38 Go Test %!s(int=5)
2020/02/22 01:24:40 Go Test %!s(int=6)
2020/02/22 01:24:42 Go Test %!s(int=7)
2020/02/22 01:24:44 Go Test %!s(int=8)
2020/02/22 01:24:46 Go Test %!s(int=9)
2020/02/22 01:24:46 starting ... Go Test()
2020/02/22 01:24:48 Go Test %!s(int=0)
2020/02/22 01:24:50 Go Test %!s(int=1)
2020/02/22 01:24:52 Go Test %!s(int=2)
...

Однако выполнение http://localhost: 3016 / gotest в разных браузерах или через curl в командной строке приведет к одновременному выполнению:

2020/02/22 01:28:55 starting ... Go Test()
2020/02/22 01:28:57 Go Test %!s(int=0)
2020/02/22 01:28:58 starting ... Go Test()
2020/02/22 01:28:59 Go Test %!s(int=1)
2020/02/22 01:29:00 Go Test %!s(int=0)
2020/02/22 01:29:01 Go Test %!s(int=2)
2020/02/22 01:29:02 Go Test %!s(int=1)
2020/02/22 01:29:03 Go Test %!s(int=3)
2020/02/22 01:29:04 Go Test %!s(int=2)
2020/02/22 01:29:05 Go Test %!s(int=4)
...

Почему это имеет значение, если URL вызывается из разных windows или вкладок одного и того же браузера по сравнению с разными браузерами?

1 Ответ

0 голосов
/ 22 февраля 2020

это действительно проблема браузера. Изменение URL для включения чего-то уникального заставит браузер перестать «блокировать» себя.

func gotest(w http.ResponseWriter, req *http.Request) {
    log.Printf("starting ... Go Test()")
    key := req.URL.Query()["key"]
    for i := 0; i < 10; i++ {
        time.Sleep(2 * time.Second)
        log.Printf("Go Test %s %s", key, i)
        fmt.Fprintf(w, "Go Test %s %s", key, i)
    }
}

и выполнение:

http://localhost:3016/gotest?key=A
http://localhost:3016/gotest?key=B

приведет к параллелизму:

2020/02/22 09:09:17 starting ... Go Test()
2020/02/22 09:09:19 Go Test [A] %!s(int=0)
2020/02/22 09:09:21 Go Test [A] %!s(int=1)
2020/02/22 09:09:22 starting ... Go Test()
2020/02/22 09:09:23 Go Test [A] %!s(int=2)
2020/02/22 09:09:24 Go Test [B] %!s(int=0)
2020/02/22 09:09:25 Go Test [A] %!s(int=3)
2020/02/22 09:09:26 Go Test [B] %!s(int=1)

Это кажется довольно стандартным поведением, так как Google Chrome и Firefox оба делают это.

...