पढ़ने से एक goroutine चैनल अवरुद्ध बिना

0

सवाल

मैं दो goroutines: मुख्य worker और एक helper कि यह स्पिन बंद के लिए कुछ मदद की है । helper का सामना कर सकते हैं त्रुटियों, तो मैं का उपयोग एक चैनल से संवाद करने के लिए त्रुटियों से helper करने के लिए worker.

func helper(c chan <- error) (){
    //do some work
    c <- err // send errors/nil on c
}

यहाँ है कैसे helper() कहा जाता है:

func worker() error {
    //do some work
    c := make(chan error, 1)
    go helper(c)
    err := <- c
    return err
}

सवाल:

  • बयान है err := <- c अवरुद्ध worker? मैं ऐसा नहीं लगता है के बाद से, चैनल बफर है.

  • अगर यह अवरुद्ध है, मैं कैसे बनाने के लिए यह गैर-अवरुद्ध? मेरी आवश्यकता है के लिए है worker और अपने फोन के साथ जारी रखने के काम के आराम के बिना, प्रतीक्षा के लिए मूल्य पर प्रदर्शित करने के लिए चैनल.

धन्यवाद.

channel go goroutine
2021-11-24 01:59:57
3

सबसे अच्छा जवाब

2

आप कर सकते हैं आसानी से सत्यापित करें

func helper(c chan<- error) {
    time.Sleep(5 * time.Second)
    c <- errors.New("") // send errors/nil on c
}

func worker() error {
    fmt.Println("do one")

    c := make(chan error, 1)
    go helper(c)

    err := <-c
    fmt.Println("do two")

    return err
}

func main() {
    worker()
}

क्यू: बयान है गलती := <- सी अवरुद्ध कार्यकर्ता? मैं ऐसा नहीं लगता है के बाद से, चैनल बफर है.

एक: err := <- c ब्लॉक करेगा कार्यकर्ता ।

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

एक: यदि आप नहीं चाहते अवरुद्ध है, बस निकालें err := <-c. अगर आप की जरूरत है गलती अंत में, बस कदम err := <-c अंत करने के लिए.

आप नहीं पढ़ सकते हैं, चैनल रोकने के बिना, आप के माध्यम से जाने के बिना अवरुद्ध कर सकते हैं, कर सकते हैं कोई और अधिक exec इस कोड है, जब तक कि अपने कोड है, एक पाश में.

Loop:
    for {
        select {
        case <-c:
            break Loop
        default:
            //default will go through without blocking
        }
        // do something
    }

और क्या तुमने कभी देखा errgroup या waitgroup?

यह उपयोग परमाणु रद्द करने के लिए, संदर्भ और सिंक.एक बार इस लागू करने के लिए.

https://github.com/golang/sync/blob/master/errgroup/errgroup.go

https://github.com/golang/go/blob/master/src/sync/waitgroup.go

या आप कर सकते हैं बस का उपयोग करें इसे जाना है, तुम समारोह और फिर प्रतीक्षा करें, त्रुटि के लिए किसी भी जगह में आप चाहते हैं.

2021-12-01 21:31:34
1

अपने कोड में, काम के बाकी है कि क्या से स्वतंत्र सहायक में कोई त्रुटि आई । आप कर सकते हैं बस से प्राप्त चैनल के आराम के बाद काम पूरा हो गया है ।

func worker() error {
    //do some work
    c := make(chan error, 1)
    go helper(c)
    //do rest of the work
    return <-c
}
2021-11-24 02:54:28

अच्छी तरह से नहीं होगा, कार्यकर्ता, () अवरुद्ध हो जब तक एक मूल्य पर प्रकट होता है c?
Someone

इसके अलावा, मैं सिर्फ संपादित worker(). यह त्रुटि देता है/शून्य करने के लिए अपने फोन करने वाले. तो, यह आपरेशन अवरुद्ध हो?
Someone

हाँ है कि विशेष रूप से ऑपरेशन रोकेंगे जब तक सहायक भेजता है error या nil करने के लिए चैनल. लेकिन कार्यकर्ता अवरुद्ध है के बाद ही इसे पूरा कर लिया है, अपने सभी काम करते हैं.
Chandra Sekar

लेकिन यह है कि ब्लॉक कॉलर के worker. वहाँ एक तरीका है इसे बनाने के लिए गैर-अवरुद्ध?
Someone

अगर कार्यकर्ता, और फलस्वरूप अपने फोन करने वाले की है, कोई इंतजार के लिए सहायक को पूरा करने के लिए, कैसे कर सकते हैं यह त्रुटि वापस से सहायक है?
Chandra Sekar
0

मुझे लगता है कि आप की जरूरत है इस कोड..

इस कोड को चलाने

package main

import (
    "log"
    "sync"
)

func helper(c chan<- error) {

    for {
        var err error = nil
        // do job

        if err != nil {
            c <- err // send errors/nil on c
            break
        }
    }

}

func worker(c chan error) error {
    log.Println("first log")

    go func() {
        helper(c)
    }()

    count := 1
    Loop:
        for {
            select {
            case err := <- c :
                return err
            default:
                log.Println(count, " log")
                count++
                isFinished := false
                // do your job
                if isFinished {
                    break Loop // remove this when you test

                }
            }
        }
    return nil
}

func main() {
    wg := sync.WaitGroup{}
    wg.Add(1)
    go func() {
        c := make(chan error, 1)
        worker(c)
        wg.Done()
    }()
    wg.Wait()
}
2021-11-24 02:35:53

आप व्याख्या कर सकते हैं, के रास्ते से एक को संपादित करने के लिए इस सवाल का जवाब, क्यों यह मदद मिलेगी? मुझे आश्चर्य है कि अगर है कि उपयोगी हो जाएगा, यदि नहीं, तो सवाल करने के लिए लेखक के लिए, भविष्य के पाठकों.
halfer

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में