2012-05-23 12 views
47

इस सरल HTTP सर्वर में समय-समय पर कॉल होता है। नींद() जो बनाता है प्रत्येक अनुरोध में पांच सेकंड लगते हैं। जब मैं ब्राउज़र में एकाधिक टैब को तेज़ी से लोड करने का प्रयास करता हूं, तो यह स्पष्ट है कि प्रत्येक अनुरोध अनुक्रमित रूप से कतारबद्ध और संभाला जाता है। मैं इसे समवर्ती अनुरोधों को कैसे संभाल सकता हूं?गोलांग में मेरा वेबसर्वर समवर्ती अनुरोधों को क्यों नहीं संभाला जा रहा है?

package main 

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

func serve(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintln(w, "Hello, world.") 
    time.Sleep(5 * time.Second) 
} 

func main() { 
    http.HandleFunc("/", serve) 
    http.ListenAndServe(":1234", nil) 
} 

असल में, मुझे प्रश्न लिखने के बाद इसका जवाब मिला, और यह बहुत सूक्ष्म है। मैं इसे वैसे भी पोस्ट कर रहा हूं, क्योंकि मुझे Google पर जवाब नहीं मिला। क्या आप देख सकते हैं कि मैं क्या गलत कर रहा हूं?

+0

आपको जो जवाब मिला है? –

+3

समस्या जिस तरह से मैंने परीक्षण किया था। वेब ब्राउज़र किसी भी सर्वर पर किए गए कनेक्शन की संख्या को सीमित करते हैं, यहां तक ​​कि टैब के बीच भी। –

+1

आप अपने सर्वर –

उत्तर

84

आपका प्रोग्राम पहले से ही अनुरोधों को संभालता है।

ab -c 500 -n 500 http://localhost:1234/ 

अपने सिस्टम पर, बेंचमार्क सभी 500 समवर्ती अनुरोध का उत्तर देने के लिए 5043ms की कुल लेता है: आप एक बेंचमार्क उपकरण जो अपाचे 2 के साथ भेज दिया है ab साथ यह परीक्षण कर सकते हैं। यह सिर्फ आपका ब्राउज़र है जो प्रति वेबसाइट कनेक्शन की संख्या को सीमित करता है।

बेंचमार्किंग गो प्रोग्राम इस तरह से आसान नहीं है, क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि आपका बेंचमार्क टूल बाधा नहीं है और यह भी कई समवर्ती कनेक्शन को संभालने में सक्षम है। इसलिए, लोड उत्पन्न करने के लिए कुछ समर्पित कंप्यूटरों का उपयोग करना एक अच्छा विचार है।

+24

पर अनुरोध जारी करने के लिए जेएमटर का भी उपयोग करना चाह सकते हैं मैं उस अंतिम पैराग्राफ से "गो" शब्द को निकालने के लिए अपना उत्तर संपादित करना चाहता हूं ... ;-) – Ashe

+1

मैं कोड को समझने की कोशिश कर रहा हूं: क्या हम उस http को इंगित करते हैं। HandleFunc() अनुरोध को संभालने के लिए एक goroutine spawns और तो यह तुरंत लौटता है? – Eno

+9

goroutines बहुत पहले पैदा हुए हैं। http.ListenAndServe एक अनंत लूप में नए कनेक्शन स्वीकार करता है और उन्हें संभालने के लिए नए goroutines spawns। – tux21b

7

सर्वर.go से, जब कनेक्शन स्वीकार किया जाता है तो चलने की प्रक्रिया सेवा समारोह में उत्पन्न होती है। नीचे टुकड़ा, है: -

// Serve accepts incoming connections on the Listener l, creating a 
// new service goroutine for each. The service goroutines read requests and 
// then call srv.Handler to reply to them. 
func (srv *Server) Serve(l net.Listener) error { 
     for { 
      rw, e := l.Accept() 
       if e != nil { 
...... 
      c, err := srv.newConn(rw) 
      if err != nil { 
       continue 
      } 
      c.setState(c.rwc, StateNew) // before Serve can return 
      go c.serve() 
     } 
} 
0

आप XHR अनुरोध का उपयोग करते हैं, यह सुनिश्चित करें कि XHR उदाहरण एक स्थानीय चर रहा है बनाते हैं।

उदाहरण के लिए, xhr = new XMLHttpRequest() एक वैश्विक चर है। जब आप एक ही एक्सएचआर वैरिएबल के साथ समानांतर अनुरोध करते हैं तो आपको केवल एक परिणाम मिलता है। इसलिए, आपको इस var xhr = new XMLHttpRequest() की तरह स्थानीय रूप से xhr घोषित करना होगा।

संबंधित मुद्दे