القراء مثلك يساعدون في دعم MUO. عند إجراء عملية شراء باستخدام الروابط الموجودة على موقعنا ، فقد نربح عمولة تابعة. اقرأ أكثر.

السياق هو أحد الميزات الهامة في Go التي تتيح التزامن. في Go ، يشير "السياق" إلى الحزمة التي توفر وظائف لقيم نطاق الطلب وإشارات الإلغاء عبر حدود API.

تعمل حزمة السياق في وقت واحد مع نموذج التزامن Go ، استنادًا إلى مفهوم goroutines. تعد Goroutines خيوط تنفيذ خفيفة الوزن يمكنك إنشاؤها وإدارتها بكفاءة ، مما يجعل من السهل إنشاء برامج متزامنة في Go.

حزمة السياق

توفر حزمة السياق وظائف لإلغاء الوظائف طويلة المدى أو سلاسل المكالمات بالكامل. تساعد الحزمة أيضًا في تخزين قيم نطاق الطلب للوصول إليها في أي مكان داخل سلسلة الاستدعاء. هذه الميزة مفيدة عند العمل مع واجهات برمجة التطبيقات أو الخدمات المصغرة ، حيث قد تمتد الطلبات إلى استدعاءات وظائف متعددة وتريد إلغاءها أو إرفاق قيم محددة بها.

إليك كيفية استيراد حزمة السياق في ملف برامج Go.

يستورد"سياق"

تأخذ وظائف السياق في سياق نوع البنية لحزمة السياق. تقليديا ، يجب عليك استخدام ctx كاسم متغير المثيل.

funcعمليات(سياق ctx. سياق) {
}

يمكن للوظائف إرجاع نوع بنية السياق للوظائف والعمليات الأخرى.

instagram viewer
funcعمليات(سياق ctx. سياق)سياق.سياق {
}

يمكنك إنشاء سياق جديد بامتداد لكى يفعل وظيفة حزمة السياق. تنشئ الدالة TODO سياقًا جديدًا بقيمة سياق. منتهي()، وهي قناة سيتم إغلاقها عند إلغاء السياق. يجب عليك استخدامه كعنصر نائب عندما تحتاج إلى سياق ولكن لا توجد سياقات أصل مناسبة.

يستورد"سياق"

funcرئيسي() {
ctx: = السياق. لكى يفعل()
}

بدلا من ذلك ، فإن خلفية تقوم الوظيفة بإنشاء سياق جديد بدون قيمة وقناة تم فارغة.

ctx: = السياق. خلفية()

يجب عليك استخدام وظيفة الخلفية كجذر لشجرة السياق.

السياق مع القيم

توفر حزمة السياق وظيفة لقيم الانتشار وإشارات الإلغاء. يمكنك استخدام قيم المعلومات من بيانات نطاق الطلب إلى إشارات الإلغاء والمواعيد النهائية.

تسمح حزمة السياق أيضًا بإنشاء سياق فرعي موروث من السياقات الأصلية ، مما يسمح بالكفاءة التعامل مع القيم وإشارات الإلغاء خلال البرنامج حيث يمكنك تمرير السياق عبر عدة المهام.

فيما يلي مثال على تمرير السياق عبر الوظائف باستخدام حزمة السياق.

يستورد (
"سياق"
)

funcنص قيمة(سياق ctx. سياق)سياق.سياق {
يعود سياق. WithValue (ctx، "مفتاح المرور", "hfouneqcelkwfu")
}

funcgetContextData(سياق ctx. سياق)أي {
مفتاح المرور: = ctx. قيمة("مفتاح المرور")
يعود تمرير المفتاح
}

ال نص قيمة تأخذ الدالة نسخة سياق وترجع نسخة سياق للوظيفة التالية. مثيل السياق هو قيمة تم إنشاؤها باستخدام الامتداد WithValue طريقة. تأخذ طريقة WithValue مثيل السياق من الوظيفة وزوج القيمة الرئيسية.

لاسترداد البيانات من السياق ، ستحتاج إلى إنشاء سياق جديد بامتداد لكى يفعل أو خلفية وظيفة وتمرير السياق إلى الوظيفة (في هذه الحالة ، valueContext) وتلقي السياق مع getContextData وظيفة.

funcرئيسي() {
ctx: = السياق. خلفية()
ctx = قيمة المحتوى (ctx)
FMT. Println (ReceiveContextData (ctx))

}

متغير ctx هو مثيل السياق من وظيفة الخلفية. تأخذ الدالة valueContext متغير ctx وترجع السياق بقيمة تأخذها الدالة ReceiptContextData وترجع القيمة من زوج القيمة-المفتاح.

مهلة السياق والمواعيد النهائية

ال سياق توفر الحزمة وظائف لتحديد المهلات والمواعيد النهائية في العمليات. يعد تحديد المهلات والمواعيد النهائية مفيدًا للعمليات التي تحتاج إلى اللحاق بالركب.

المهلات هي المدة الزمنية التي تستغرقها العملية. يمكنك تعيين مهلة لعملية تستغرق 4 ثوان ؛ بعد ذلك ، يلغي السياق الطلب.

من ناحية أخرى ، يحدد الموعد النهائي النقطة المطلقة التي يجب أن تلغي فيها العملية.

يمكنك استخدام ال مع مهلة طريقة لتعيين مهلة السياق. إليك كيفية تعيين مهلة 2 ثانية.

funcرئيسي() {
ctx ، إلغاء: = السياق. WithTimeout (سياق. خلفية()، 2 * وقت. ثانية)
تأجيل يلغي()

// بعض العمليات
}

ال رئيسي تقوم الدالة بإنشاء سياق مع مهلة ثانيتين. ترجع وظيفة WithTimeout وظيفة إلغاء يمكنك تأجيلها للإلغاء عند الخروج من الوظيفة الرئيسية.

يمكنك إعلان المواعيد النهائية مع مع الموعد النهائي طريقة. تأخذ طريقة WithDeadline في مثيل السياق ووقت الموعد النهائي.

funcقم بعمل ما(سياق ctx. سياق) {
الموعد النهائي: = الوقت. الآن (). أضف (1500 * وقت. ميلي ثانية)
ctx، ctxCancel: = السياق. WithDeadline (ctx، deadlineTime)
تأجيل ctx إلغاء ()

// بعض العمليات

ctx إلغاء ()
}

ال قم بعمل ما تأخذ وظيفة في سياق ، و الموعد النهائي المتغير هو الوقت قبل سياق موعد التسليم. ال ctx المتغير هو السياق مع الموعد النهائي.

ال ctx إلغاء متغير يلغي السياق عندما يتجاوز السياق الموعد النهائي.

أفضل الممارسات لاستخدام السياقات في Go

تجنب استخدام السياقات كمتغيرات عامة. قد يؤدي استخدام السياقات كمتغيرات عالمية إلى سلوكيات تعليمات برمجية غير متوقعة وأخطاء يصعب تتبعها ، واستخدام السياق باعتدال لتقليل تعقيد الكود.

أخيرًا ، استخدم السياقات كإشارات وليس ضمانات. لا يضمن إلغاء السياق أن تتوقف جميع goroutines عن العمل ؛ إنها مجرد إشارة ، والجوروتينات لا تعرف السياقات.