تخطَّ إلى المحتوى

synctest.Wait

الانتظار حتى تتوقّف كل الـ goroutines داخل الفقاعة synctest.Wait

synctest.Wait تحجب حتى تصل كل goroutine أخرى داخل نفس الفقاعة لحالة حجب دائم — أداة تزامن صريحة داخل اختبارات synctest بدل انتظارات تخمينية أو Sleep قصير.

synctest.Wait يجب استدعاؤها من داخل فقاعة (أي داخل دالة ممرَّرة لـ synctest.Test) — استدعاؤها خارج فقاعة يسبّب panic فورًا. تحجب الـ goroutine المستدعية حتى تصل كل goroutine أخرى بنفس الفقاعة لحالة حجب دائم، ثم تعيد التحكّم مباشرة — نقطة تزامن حتمية للتأكّد أن عمل الخلفية اكتمل فعليًا قبل إجراء أي فحص، بدل الاعتماد على time.Sleep قصير تخميني قد ينجح أحيانًا ويفشل أحيانًا أخرى.

لو goroutine ما زالت تعمل بحلقة لا تدخل حجبًا دائمًا إطلاقًا (busy loop)، Wait لن يعود أبدًا — كل مسار يجب أن ينتهي فعليًا بحجب حقيقي كي تعمل الآلية بشكل صحيح.

الصياغة

func Wait()

📄 مثال

func TestBackgroundUpdate(t *testing.T) {
  synctest.Test(t, func(t *testing.T) {
    done := false
    go func() {
      done = true
    }()
    synctest.Wait()   // ينتظر حتى تتوقّف الـ goroutine أعلاه فعليًا
    if !done {
      t.Fatal("توقّعت أن تكتمل الـ goroutine قبل Wait")
    }
  })
}

أهم النقاط

العنصرالوظيفة
synctest.Wait()يحجب حتى تصل كل goroutine أخرى بالفقاعة لحالة حجب دائم، ثم يعيد التحكّم
داخل فقاعة synctest.Test فقطاستدعاؤه خارجها يسبّب panic فورًا

💡 نصائح عملية

  • استخدم Wait للتأكّد أن goroutine بالخلفية أنهت عملها فعليًا قبل فحص نتيجتها، بدل Sleep قصير تخميني
  • لو goroutine ما زالت تعمل بحلقة لا تدخل حجبًا دائمًا (busy loop)، Wait لن يعود أبدًا — تأكّد أن كل مسار ينتهي بحجب حقيقي

⚠️ أخطاء شائعة

  • استدعاء synctest.Wait() خارج دالة ممرَّرة لـ synctest.Test — يسبّب panic فورًا
  • توقّع أن Wait ينتظر أيضًا عمليات حجب غير دائم مثل شبكة أو mutex — لا ينتظر إلا الحجب الدائم فقط

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.