मैं सीख रहा हूं अभी उपयोग कर रहा हूं और मेरी पहली परियोजनाओं में से एक एक साधारण पिंग स्क्रिप्ट है। अनिवार्य रूप से मैं यूआरएल का एक गुच्छा पिंग करना चाहता हूं, और प्रत्येक के जवाब पर XXX सेकंड सेकंड प्रतीक्षा करें और फिर पिंग करें।goroutines के अंदर goroutines लॉन्च कर रहा है स्वीकार्य?
func main() {
// read our text file of urls
f, err := ioutil.ReadFile(urlFile)
if err != nil {
log.Print(err)
}
urlStrings := []string{}
urlStrings = strings.Split(string(f), "\n")
for _, v := range urlStrings {
go ping(v)
}
// output logs to the terminal
// channel is global
for i := range c {
fmt.Println(i)
}
}
func ping(url string) {
// for our lag timer
start := time.Now()
// make our request
_, err := http.Get(url)
if err != nil {
msg := url + " Error:" + err.Error()
fmt.Println(msg)
c <- msg
reportError(msg)
} else {
lag := time.Since(start)
var msg string
// running slow
if lag > lagThreshold*time.Second {
msg = url + " lag: " + lag.String()
reportError(msg)
}
msg = url + ", lag: " + lag.String()
c <- msg
}
time.Sleep(pingInterval * time.Second)
go ping(url) // is this acceptable?
}
मेरी प्राप्त अनुरोध मैं पहले स्थगित res.Body.Close बुला रहा था() लेकिन उसके बाद एप्लिकेशन थोड़ी देर के लिए भाग गया panicing किया गया था: यहाँ संक्षिप्त कोड है। मुझे लगता है कि जब तक goroutine कचरा इकट्ठा नहीं किया गया था तब तक स्थगित प्रतिक्रिया() को प्रतिक्रिया पर कॉल नहीं कर सका और res अब अस्तित्व में नहीं था।
मुझे यह सोचने में मदद मिली कि अगर गोरौटाइन के अंदर एक गोरौटाइन बुलाकर सबसे अच्छा अभ्यास होता है या यदि मैं समारोह को कभी बाहर नहीं निकलता, और फिर एक डिफर को केवल कूरा एकत्र होने के बाद ही बुलाया जाता है।
अन्य goroutines से goroutines spawning कोई समस्या नहीं होनी चाहिए, लेकिन इस मामले में सिर्फ एक लूप का उपयोग न करने का कोई कारण नहीं है? –
@JamesHenstridge I मैं इसे प्रक्रियात्मक लूप में नहीं कर रहा हूं इसलिए मुझे अगली कॉल करने से पहले प्रत्येक अनुरोध को वापस लौटने की प्रतीक्षा नहीं करनी पड़ेगी। मैं समरूपता का उपयोग करने की कोशिश कर रहा हूं ताकि प्रत्येक पिंग चक्र अपने स्वयं के अंतराल के समय पर स्वतंत्र हो। – ARolek
मैं उस हिस्से का जिक्र कर रहा था जहां 'पिंग()' गोरौटाइन बाहर निकलने से ठीक पहले एक और गोरौटाइन पैदा करता है। यदि आप 'पिंग()' के अंदर एक लूप डालते हैं, तो आपको वही प्रभाव मिल जाएगा। –