2012-06-25 3 views
9

Я играл с HTTP-пакетом. Я хотел обрабатывать запрос параллельно, как и в java. Но я не мог.Как обрабатывать параллельный HTTP-запрос в языке программирования go?

Я создал простой веб-сервер, поспав посередине и понял, что нужно обрабатывать один запрос за раз, поэтому, если бы я обновил браузер, процесс первого запроса должен завершиться до второго запроса начать обработку, вот код:

func main(){ 

    //Process the http commands 
    fmt.Printf("Starting http Server ... ") 
    http.Handle("/", http.HandlerFunc(sayHello)) 
    err := http.ListenAndServe("0.0.0.0:8080", nil) 
    if err != nil { 
     fmt.Printf("ListenAndServe Error",err) 
    } 
} 

func sayHello(c http.ResponseWriter, req *http.Request) { 
    fmt.Printf("New Request\n") 
    processRequest(c, req) 
} 

func processRequest(w http.ResponseWriter, req *http.Request){ 
    time.Sleep(time.Second*3) 
    w.Write([]byte("Go Say’s Hello(Via http)")) 
    fmt.Println("End") 
} 

Как я хотел обрабатывать оба запроса параллельно я добавил «идут» команду перед «ProcessRequest (с, REQ)» в функции «SayHello» для того, чтобы обработать каждый запросить в другом горитине. Но ... это не работает ... Я не знаю, почему. Я знаю, что оба запроса обработаны, потому что я вижу печатную строку на консоли, но браузер все время ждет информации ..... и не показываю свой ответ.

Итак ... мои вопросы,

создать ли каждый запрос новый http.ResponseWriter? или он использует то же самое? Знаете ли вы, как указать веб-сервер для обработки каждого запроса с помощью разных потоков?

Любая помощь приветствуется ....

Fersca

ответ

20

Все соединения автоматически обрабатываются одновременно. Каждое TCP-соединение (не запрос) получает свой собственный goroutine.

В мире с http-конвейерной обработкой и браузерами, которые повторно используют соединения, это может не всегда хорошо работать. Скорее всего, ваш браузер повторно использует соединение, которое останавливает его, пока текущий запрос не будет обработан goroutine.

+0

Спасибо. Так много времени тратилось сегодня только из-за слишком умного поведения браузера :) –

0

Чтобы разрешить поддержку во время выполнения, чтобы использовать более одной операционной системы нитку вы можете захотеть установить это число с помощью:

runtime.GOMAXPROCS(n) 

или установить переменную окружения GOMAXPROCS.

Чтобы получить количество доступных ядер, использовать

runtime.NumCPU() 

Таким образом, вы часто в конечном итоге с

runtime.GOMAXPROCS(runtime.NumCPU()) 
+0

Это не поможет. Go по умолчанию параллелен, просто не многопоточен (между ними есть большая разница). Он переключится на другой goroutine на блокировку вызовов типа 'time.Sleep()' и '.Write()'. – ayke

0

Я думаю, что ваш браузер ждет, потому что вы не послал ответ обратно к нему Ваш браузер сделал запрос sayHello и sayHello также сделал запрос processRequest, из вашего кода processRequest отправил ответ на sayHello, но sayHello не отправил ответ на браузер.

вы можете использовать http.Get или http.Post для вызова processRequest

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