2013-03-01 3 views

उत्तर

13

किसी भी एपइंजिन सेवा के लिए पाइथन या जावा एसिंक्रोनस एपीआई के बराबर कोई गो नहीं है। वास्तव में, गो मानक पुस्तकालय में मानक एसिंक्रोनस शैली में कुछ भी नहीं है। इसका कारण यह है कि गो में, आप अवरुद्ध शैली का उपयोग करके फ़ंक्शन लिखते हैं और आवश्यकता के आधार पर कुछ बुनियादी समवर्ती प्राइमेटिव का उपयोग करके उन्हें लिखें। जबकि आप dastore.Get कॉल की शुरुआत में go को केवल तभी नहीं ले सकते हैं, यह अभी भी अपेक्षाकृत सरल है। निम्नलिखित, काल्पनिक उदाहरण पर विचार करें:

func loadUser(ctx appengine.Context, name strings) (*User, err) { 
    var u User 
    var entries []*Entry 
    done := make(chan error) 

    go func() { 
    // Load the main features of the User 
    key := datastore.NewKey(ctx, "user", name, 0, nil) 
    done <- datastore.Get(ctx, key) 
    }() 

    go func() { 
    // Load the entries associated with the user 
    q := datastore.NewQuery("entries").Filter("user", name) 
    keys, err := q.GetAll(ctx, &entries) 
    for i, k := range keys { 
     entries[i].key = k 
    } 
    done <- err 
    }() 

    success := true 
    // Wait for the queries to finish in parallel 
    for i := 0; i < 2 /* count the funcs above */; i++ { 
    if err := <-done; err != nil { 
     ctx.Errorf("loaduser: %s", err) 
     success = false 
    } 
    } 
    if !success { 
    return 
    } 

    // maybe more stuff here 
} 

यह वही दृष्टिकोण में ऐसी हर संदर्भ में आप एक से अधिक बात यह है कि एक ही समय में थोड़ा समय लग सकता है, चाहे वह एक डेटासंग्रह कॉल है चलाने की आवश्यकता में इस्तेमाल किया जा सकता है, urlfetch, फ़ाइल लोड, आदि

+0

यह काम कैसे दिया जाता है कि जीएई पर गो ऐप्स को एक थ्रेड पर चलाया जाता है? –

+2

गो रनटाइम मल्टीप्लेक्स कई goroutines एक एकल ऑपरेटिंग सिस्टम थ्रेड पर। वास्तव में, ऐपइंजिन के बाहर भी डिफ़ॉल्ट GOMAXPROCS = 1 है, जिसका अर्थ है कि केवल एक goroutine सक्रिय रूप से आपका कोड चलाएगा। इसके बावजूद, रनटाइम goroutines के बीच आगे और आगे स्वैप करेगा जब वे संवाद, ब्लॉक, एक syscall निष्पादित, या ताला पर इंतजार कर रहे हैं। –

+0

धन्यवाद। तो क्या वे एक प्रदर्शन लाभ भी हैं यदि वे एक थ्रेड पर चल रहे हैं? मेरी अज्ञान क्षमा करें। संपादित करें: मुझे लगता है कि प्रदर्शन लाभ गो निष्पादन कोड से आएगा, जबकि यह आई/ओ कॉल वापस आने की प्रतीक्षा कर रहा है? –

2

गो में एसिंक के लिए कोई स्पष्ट API नहीं है। आपको इसके बजाय दिनचर्या का उपयोग करना चाहिए। मैंने इस पर कोई स्रोत नहीं देखा है, लेकिन मुझे संदेह है कि एसिंक एपीआई वहां नहीं है क्योंकि दिनचर्या का उपयोग करना कितना आसान है।

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