2012-06-25 13 views
9

मैं जाने वाले HTTP पैकेज के साथ खेल रहा था। मैं जावा में जैसा समानांतर में अनुरोध संसाधित करना चाहता था। लेकिन मैं नहीं कर सका।प्रोग्रामिंग भाषा में समानांतर HTTP अनुरोध को कैसे संसाधित करें?

मैंने एक साधारण वेब सर्वर बनाया, बीच में नींद डाली और महसूस किया कि प्रति बार एक अनुरोध प्रक्रिया करें, इसलिए यदि मैंने अपने ब्राउज़र पर रीफ्रेश किया है, तो पहले अनुरोध की प्रक्रिया को दूसरे अनुरोध तक पूरा करना होगा प्रसंस्करण शुरू, यहाँ कोड है:

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 (ग, अनुरोध)" "sayHello" समारोह में कार्रवाई करने के लिए करना चाहता था के रूप में एक अलग gorutine में अनुरोध। लेकिन ... यह काम नहीं करता .... मुझे नहीं पता क्यों। मुझे पता है कि दोनों अनुरोध संसाधित किए गए हैं क्योंकि मैं कंसोल पर मुद्रित रेखा देखता हूं लेकिन ब्राउजर जानकारी के लिए इंतजार कर रहा है ..... और मेरी प्रतिक्रिया न दिखाएं।

तो ... मेरे सवालों का,

प्रत्येक अनुरोध एक नया http.ResponseWriter बनाने करता है? या यह वही उपयोग है? क्या आप जानते हैं कि विभिन्न अनुरोधों के साथ प्रत्येक अनुरोध को संसाधित करने के लिए वेब सर्वर को कैसे इंगित किया जाए?

किसी भी मदद का स्वागत किया है ....

Fersca

उत्तर

20

सभी कनेक्शन स्वचालित रूप से समवर्ती नियंत्रित किया जाता है। प्रत्येक टीसीपी कनेक्शन (अनुरोध नहीं) अपने स्वयं के goroutine हो जाता है।

http पाइपलाइनिंग और ब्राउज़र का उपयोग करने वाले ब्राउज़र में कनेक्शन का पुन: उपयोग करने वाली दुनिया में, यह हमेशा अच्छी तरह से काम नहीं कर सकता है। सबसे अधिक संभावना है कि आपका ब्राउज़र एक कनेक्शन का पुन: उपयोग कर रहा है जो इसे तब तक रोकता है जब तक कि वर्तमान अनुरोध को गोरौटाइन खत्म नहीं किया जाता है।

runtime.GOMAXPROCS(n) 

या GOMAXPROCS वातावरण चर सेट:

+0

धन्यवाद। ब्राउजर के बहुत ही स्मार्ट व्यवहार की वजह से आज बहुत समय बर्बाद हो गया :) –

0

रन-टाइम समर्थन एक से अधिक ओएस धागा आप के माध्यम से उस नंबर सेट कर सकते हैं का उपयोग करने की अनुमति देने के।

उपलब्ध कोर की संख्या प्राप्त करने के लिए, का उपयोग

runtime.NumCPU() 

इसलिए आप अक्सर

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

इससे मदद नहीं मिलती है। गो डिफ़ॉल्ट रूप से समवर्ती है, बस multithreaded नहीं है (दोनों के बीच एक बड़ा अंतर है)। यह कॉल को अवरुद्ध करने पर एक अलग गोरौटाइन पर स्विच करेगा जैसे 'टाइम। स्लीप()' और '। राइट() '। – ayke

0

अंत मुझे लगता है कि क्योंकि आप नहीं यह वापस करने के लिए एक जवाब भेजा था आपके ब्राउज़र प्रतीक्षा कर रहा है आपके ब्राउजर ने हेल्लो कहने का अनुरोध किया और कहा कि हेल्लो ने आपके कोड प्रक्रिया से प्रोसेस, को प्रोसेस करने का अनुरोध भी किया है। अनुरोध ने हेल्लो को एक प्रतिक्रिया वापस भेज दी है लेकिन कहें हैलो ने ब्राउजर को प्रतिक्रिया नहीं भेजी है।

आप प्रक्रिया को कॉल करने के लिए http.Get या http.Post का उपयोग कर सकते हैं Request

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