В Golang блокируется ли http.HandleFunc?

Я пишу https-сервер на Golang, но я обнаружил, что http.HandleFunc будет заблокирован при многократных запросах из веб-браузера. как я могу заставить сервер обрабатывать несколько запросов одновременно? Спасибо.

мой код:

func DoQuery(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    fmt.Printf("%d path %s\n", time.Now().Unix(), r.URL.Path)
    time.Sleep(10 * time.Second)
    fmt.Fprintf(w, "hello...")
    //why this function block when multi request ?
}

func main() {
    fmt.Printf("server start working...\n")
    http.HandleFunc("/query", DoQuery)
    s := &http.Server{
        Addr:         ":9090",
        ReadTimeout:  30 * time.Second,
        WriteTimeout: 30 * time.Second,
        //MaxHeaderBytes: 1 << 20,
    }
    log.Fatal(s.ListenAndServe())
    fmt.Printf("server stop...")
}

Я запустил ваш код, и все сработало, как и ожидалось. Я сделал два запроса одновременно (curl localhost:9090/query), и оба они завершились через 10 секунд вместе. Может проблема в другом? Вот команда, которую я использовал: time curl -s localhost:9090/query | echo $(curl -s localhost:9090/query) – tjameson

спасибо

это странно. когда я запрашиваю один и тот же URL-адрес из chrome, отправьте два запроса, которые не обрабатываются одновременно, но использование cur test может обрабатываться одновременно. но когда я отправляю два запроса, используйте разные URL-адреса, их можно обрабатывать одновременно.

[root@localhost httpsсервер]# ./httpServer

сервер начал работать...

1374301593 путь / запрос? форма = хром

1374301612 путь /запрос?от=cur2

1374301614 путь /запрос?от=cur1

1374301618 путь / запрос? форма = хром

1374301640 путь / запрос? форма = chrome2

1374301643 путь / запрос? форма = chrome1

*1374301715 путь /запрос?форма=хром

1374301725 путь /запрос?форма=хром*

**1374301761 путь /запрос?form=chrome1

1374301763 путь /запрос?form=chrome2**


person user2601460    schedule 20.07.2013    source источник
comment
моя версия Go: версия go go1.1.1 linux/386   -  person user2601460    schedule 20.07.2013
comment
Что вы имеете в виду под блокировкой? Какое поведение, которое вы видите, было неожиданным?   -  person Jeremy Wall    schedule 20.07.2013
comment
я отправляю два запроса в веб-браузере одновременно. второй запрос был обработан через 10 секунд. сервер начинает работать... 1374289669 путь/запрос 1374289679 путь/запрос Я хочу, чтобы два дескриптора запроса выполнялись одновременно, например 1374289669 путь/запрос 1374289669 путь/запрос   -  person user2601460    schedule 20.07.2013
comment
FWIW, ваш fmt.Printf("server stop...") никогда не будет вызван, потому что log.Fatal завершит процесс: источник   -  person beatgammit    schedule 20.07.2013
comment
http-пакет Go может обслуживать тысячи запросов одновременно. Вы не блокируете свою программу и не прекращаете получать новые запросы при обслуживании.   -  person Mostafa    schedule 20.07.2013
comment
Я запустил ваш код, и все сработало, как и ожидалось. Я сделал два запроса одновременно (curl localhost:9090/query), и оба они завершились через 10 секунд вместе. Может проблема в другом? Вот команда, которую я использовал: time curl -s localhost:9090/query | echo $(curl -s localhost:9090/query)   -  person beatgammit    schedule 20.07.2013
comment
Я использую Google Chrome на том же компьютере. я попробую curl, чтобы проверить.   -  person user2601460    schedule 20.07.2013


Ответы (1)


Да, стандартный HTTP-сервер будет запускать новую горутину для каждого запроса. Вы должны иметь возможность выполнять тысячи запросов параллельно в зависимости от настроек операционной системы.

Ваш браузер может ограничивать количество запросов, которые он будет отправлять на один сервер; убедитесь, что вы тестируете клиент, у которого нет этого ограничения/"оптимизации".

Документы Reliably Go объясняют, что Http-сервер создает новую горотину для каждого запроса: http://golang.org/pkg/net/http/#Server.Serve

person Ask Bjørn Hansen    schedule 20.07.2013
comment
большое спасибо, я думаю, что это причина ограничения браузера Chrome. когда я запрашиваю один и тот же URL-адрес из chrome, отправьте два запроса, которые не обрабатываются одновременно, но использование cur test может обрабатываться одновременно. но когда я отправляю два запроса, используйте разные URL-адреса, их можно обрабатывать одновременно. - person user2601460; 20.07.2013
comment
Я думаю, вы имеете в виду одновременно, а не параллельно. Для параллельного обслуживания тысяч запросов потребуются тысячи ядер ЦП. - person ; 20.07.2013
comment
@rightfold Для этой конкретной программы то же самое, но, конечно, вы правы. - person Ask Bjørn Hansen; 20.07.2013