2013-07-20 2 views
3

Я пишу httpserver в Голанге, но я нахожу, что http.HandleFunc будет блокироваться, когда много запросов от веб-браузера. как я могу заставить сервер обрабатывать несколько запросов в одно и то же время? Благодарю.В Голанге есть блок 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 | Эхо $ (завиток -s локальный: 9090/запрос) - tjameson

thakns

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

[корень @ локальный HTTPServer] # ./httpServer начать работать

сервера ...

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

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

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

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

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

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

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

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

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

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

+0

мой Go версия: идти версия go1.1.1 линукс/386 – user2601460

+0

Что вы имеете в виду, блокируя? Какое поведение вы видите неожиданным? –

+0

Я отправляю два запроса в веб-браузере одновременно. второй запрос был обработан через 10 секунд. сервер начнет работать ... 1374289669 путь/запрос 1374289679 путь/запрос Я хочу два запроса ручки в то же время, как 1374289669 путь/запрос 1374289669 путь/запрос – user2601460

ответ

10

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

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

Достоверно Перейти документы объясняя HTTP-сервер создает новый gorotine для каждого запроса: http://golang.org/pkg/net/http/#Server.Serve

+1

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

+1

Я думаю, вы имеете в виду одновременно, а не параллельно. Для одновременного обслуживания тысяч запросов потребуются тысячи ядер процессора. –

+1

@rightfold Для этой конкретной программы это то же самое, но, конечно, вы правы. –

Смежные вопросы