سؤال:
أنت تقوم بإنشاء أداة تتعامل مع مكالمات HTTP المتعددة في goroutines المتزامنة. لمنع سيناريو التنفيذ لأجل غير مسمى، فإنك تبحث عن طريقة لإلغاء goroutines بعد مرور فترة زمنية محددة.الحل:
بينما نهج إنشاء goroutine للنوم لمدة محددة وإرسال رسالة بث لإلغاء goroutines الأخرى يبدو منطقيًا، ويبدو أن هناك مشكلة في تنفيذ goroutines في هذا السيناريو.لمواجهة هذا التحدي، فكر في الاستفادة من حزمة السياق في Go. إنه يوفر طريقة فعالة للتعامل مع المهلات وإلغاء السياق لـ goroutines.
مقتطف الكود:
إليك مثال باستخدام حزمة السياق لإدارة المهلة لـ goroutines: الحزمة الرئيسية يستورد ( "سياق" "إف إم تي" "وقت" ) اختبار الوظيفة (سياق ctx.Context) { ر := الوقت.الآن () يختار { الحالة package main import ( "context" "fmt" "time" ) func test(ctx context.Context) { t := time.Now() select { case <-time.After(1 * time.Second): fmt.Println("overslept") case <-ctx.Done(): fmt.Println("cancelled") } fmt.Println("used:", time.Since(t)) } func main() { ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) go test(ctx) // cancel context after 30 milliseconds time.Sleep(30 * time.Millisecond) cancel() }ينشئ هذا الرمز سياقًا بمهلة قدرها 50 مللي ثانية. يتم بعد ذلك إطلاق goroutine لتنفيذ وظيفة الاختبار، وتمرير السياق. ضمن وظيفة الاختبار، تنتظر عبارة التحديد حدوث المهلة أو إلغاء السياق. بعد 30 مللي ثانية، يتم إلغاء السياق، مما يتسبب في إنهاء goroutine وطباعة "تم الإلغاء".تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3