كيف يمكنني معرفة ما إذا تم إجراء Goroutine، دون حظر؟

StackOverflow https://stackoverflow.com/questions/1730719

  •  20-09-2019
  •  | 
  •  

سؤال

جميع الأمثلة التي رأيتها حتى الآن تنطوي على حظر للحصول على النتيجة (عبر <-chan المشغل أو العامل).

ينطوي نهجي الحالي على اجتياز مؤشر إلى بنية:

type goresult struct {
    result resultType;
    finished bool;
}

الذي يكتب Goroutine عند الانتهاء. ثم إنها مسألة بسيطة من التدقيق finished كلما مريحة. هل لديك بدائل أفضل؟

ما أستهدفه حقا هو نظام فتحة ذات طراز QT. لدي حكمة سوف تبدو الحل تافهة تقريبا (chans have. الكثير من الإمكانات غير المستكشفة)، لكنني لست مألوفا بعد مع اللغة لمعرفة ذلك.

هل كانت مفيدة؟

المحلول

يمكنك استخدام نمط "فاصلة، موافق" (انظر صفحاتها على "العودة الفعالة"):

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.

نصائح أخرى

حدد البيانات يتيح لك التحقق من قنوات متعددة في وقت واحد، مع فرع عشوائي (من تلك التي ينتظر فيها الاتصال):

func main () {
    for {
    select {
        case w := <- workchan:
            go do_work(w)
        case <- signalchan:
            return
        // default works here if no communication is available
        default:
            // do idle work
    }
    }
}

بالنسبة لجميع عمليات إرسال واستقبال التعبيرات في عبارة "تحديد"، يتم تقييم تعبير القنوات، إلى جانب أي تعبيرات تظهر على الجانب الأيمن من إرسال التعبيرات، في ترتيب من أعلى إلى أسفل. إذا كان بإمكان أي من العمليات الناتجة المتابعة، يتم اختيار المرء والاتصالات والبيانات المقابلة يتم تقييمها. خلاف ذلك، إذا كان هناك حالة افتراضية، تنفذ؛ إذا لم يكن الأمر كذلك، فإن كتل البيان حتى يتم إكمال أحد الاتصالات.

يمكنك أيضا نظرة خاطفة على المخزن المؤقت للقناة لمعرفة ما إذا كان يحتوي على أي شيء باستخدام Len:

if len(channel) > 0 {
  // has data to receive
}

هذا لن يلمس المخزن المؤقت للقناة، على عكس foo, gotValue := <- ch الذي يزيل قيمة عندما gotValue == true.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top