sync/errgroup Go: पूरी गाइड उदाहरणों के साथ

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

sync/errgroup Go: पूरी गाइड उदाहरणों के साथ

1. यह क्या है और क्यों ज़रूरी है

sync/errgroup लाइब्रेरी, golang.org/x/sync आधिकारिक एक्सटेंशन का हिस्सा है, जो एरर हैंडलिंग के साथ समानांतर goroutines को मैनेज करने का एक शक्तिशाली और सुंदर तरीका प्रदान करती है। Go की स्टैंडर्ड लाइब्रेरी में sync पैकेज में WaitGroup है, लेकिन यह goroutines से एरर इकट्ठा नहीं कर सकता। errgroup इस समस्या को हल करता है: आप कई goroutines चलाते हैं, और अगर उनमें से कोई भी एरर लौटाता है, तो ग्रुप तुरंत (या सभी के पूरा होने पर) इसका संकेत देता है, कॉन्टेक्स्ट को कैंसल करता है और बाकी goroutines को सही तरीके से समाप्त होने देता है।

यह क्यों ज़रूरी है? वास्तविक एप्लिकेशन में अक्सर कई स्वतंत्र कार्यों को समानांतर में करना होता है: फ़ाइलें डाउनलोड करना, डेटा प्रोसेस करना, API को रिक्वेस्ट भेजना। अगर एक कार्य एरर के साथ फेल हो जाता है, तो बाकी को जारी रखने का कोई मतलब नहीं है — जल्दी से रुकना और यूज़र को एरर लौटाना चाहिए। errgroup यह स्वचालित रूप से करता है: आप कॉन्टेक्स्ट पास करते हैं, और पहली एरर पर कॉन्टेक्स्ट कैंसल हो जाता है, और जो goroutines इस कॉन्टेक्स्ट को सुन रही हैं, वे समय से पहले समाप्त हो सकती हैं।

यह माइक्रोसर्विसेज, वेब सर्वर और CLI यूटिलिटीज में विशेष रूप से उपयोगी है, जहाँ एरर पर त्वरित प्रतिक्रिया महत्वपूर्ण है। चैनल और select के साथ मैन्युअल मैनेजमेंट के विपरीत, errgroup एक साफ, डिक्लेरेटिव API देता है जिसका गलत उपयोग करना मुश्किल है।

2. इंस्टॉलेशन

sync/errgroup Go की स्टैंडर्ड लाइब्रेरी का हिस्सा नहीं है, लेकिन यह golang.org/x/sync सबमॉड्यूल का हिस्सा है। इसे एक कमांड से इंस्टॉल किया जा सकता है:

go get golang.org/x/sync/errgroup

इसके बाद आप इसे अपने कोड में इम्पोर्ट कर सकते हैं:

import "golang.org/x/sync/errgroup"

सुनिश्चित करें कि आपके पास Go का वर्शन 1.13 या उससे ऊपर है (1.18+ अनुशंसित है generics के लिए, हालाँकि errgroup उनका उपयोग नहीं करता)। अगर आप मॉड्यूल (go.mod) का उपयोग कर रहे हैं, तो go get कमांड स्वचालित रूप से go.sum फ़ाइल को अपडेट करेगा।

3. त्वरित शुरुआत — न्यूनतम कार्यशील उदाहरण

नीचे एक बहुत ही सरल उदाहरण दिया गया है, जो तीन goroutines चलाता है, जिनमें से प्रत्येक एरर लौटाता है यदि दी गई संख्या नकारात्मक है। यदि कम से कम एक goroutine एरर लौटाता है, तो errgroup.Wait() वह एरर लौटाएगा।

package main

import (
    "context"
    "fmt"
    "golang.org/x/sync/errgroup"
)

func main() {
    g, ctx := errgroup.WithContext(context.Background())

    numbers := []int{1, -2, 3}
    for _, n := range numbers {
        n := n // वेरिएबल कैप्चर
        g.Go(func() error {
            select {
            case <-ctx.Done():
                return ctx.Err()
            default:
            }
            if n < 0 {
                return fmt.Errorf("negative number: %d", n)
            }
            fmt.Printf("Processed %d\n", n)
            return nil
        })
    }

    if err := g.Wait(); err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Println("All tasks completed successfully")
    }
}

आउटपुट: Processed 1, Processed 3, Error: negative number: -2। ध्यान दें कि संख्या 3 वाली goroutine शायद न चले अगर कॉन्टेक्स्ट उसके शुरू होने से पहले कैंसल हो जाता — यह जल्दी रुकने के मैकेनिज्म को दर्शाता है।

4. मुख्य तरीके/फंक्शन

नीचे errgroup पैकेज के सभी मुख्य API एलिमेंट दिए गए हैं। प्रत्येक तरीके के साथ सिग्नेचर, विवरण और कार्यशील उदाहरण शामिल है।

4.1. WithContext

सिग्नेचर: func Wi

अनुशंसाएँ