2013-09-06 10 views
13

मुझे निम्नलिखित कोड net/http/httptest में मिला और आश्चर्य है कि खाली select कथन गो में क्या करता है।खाली चयन क्या करता है?

go s.Config.Serve(s.Listener) 
if *serve != "" { 
    fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL) 
    select {} 
} 

उत्तर

8

एक खाली select{} बयान ब्लॉक अनिश्चित काल अर्थात हमेशा के लिए। यह समान है और व्यावहारिक रूप से खाली for{} कथन के बराबर है।

+0

यह मेरा अनुमान था। हालांकि मुझे अभी भी यह अर्थपूर्ण रूप से अजीब लगता है, क्योंकि 'चयन' एक शर्त सुझाता है, न कि लूप। –

+8

सीएपीयू पर गहन होने के लिए AFAIK खाली होगा (कम से कम यह है कि असीमित अनंत लूप अन्य भाषाओं में कैसे काम करते हैं)। ओपी के उदाहरण में यह संभव है कि {gor का उपयोग मुख्य goroutine से बाहर निकलने से रोकने के लिए किया जाता है। – justinas

+3

सीएसपी-बोल में, खाली चयन 'STOP' की तरह है, एक प्रक्रिया जो कभी नहीं बढ़ती है। यह एक स्व-डेडलॉक के समान है और मुझे लगता है कि यह अक्सर उपयोग नहीं किया जाता है। हालांकि, इस पैटर्न के लिए सवाल ने एक दिलचस्प और वास्तविक उपयोग-मामले का प्रस्ताव दिया। {} 'लूप के लिए एक खाली 'एक स्व-जीवनशैली है, अलग है क्योंकि यह सीपीयू संसाधनों का उपभोग करता है। –

4

खाली select कथन केवल वर्तमान goroutine को अवरुद्ध करता है।

क्यों आप ऐसा करेंगे, यहां एक कारण है। यह स्निपेट

if *serve != "" { 
    fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL) 
    s.Config.Serve(s.Listener) 
} else { 
    go s.Config.Serve(s.Listener) 
} 

यह बेहतर है कि बर्बाद गोरौटाइन नहीं है। इसमें अब भी बदतर है कोड कोड दोहराव है। लेखक बर्बाद संसाधन पर कम कोड पुनरावृत्ति के लिए अनुकूलित किया गया। नोट हालांकि स्थायी रूप से ब्लॉक गोरौटाइन को पहचानने के लिए तुच्छ है और डुप्लिकेटिंग संस्करण पर शून्य लागत हो सकती है।

7

Mac OS X पर, गो में, for { } अधिकतम करने के लिए सीपीयू% का कारण होगा, और इस प्रक्रिया के राज्य running

select { }, दूसरे हाथ पर हो जाएगा, अधिकतम करने के लिए सीपीयू% का कारण नहीं होगा, और प्रक्रिया का राज्य sleeping

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