|
استخدمنا في المثال السابق القفل الصريح باستخدام أقفال الاستبعاد المتبادل لمزامنة وصول عدة روتينات Go إلى حالة مشتركة. يمكن بدلًا من ذلك استخدام مزايا المزامنة المدمجة في روتينات Go والقنوات لتحقيق النتيجة نفسها. يتوافق هذا الأسلوب القائم على القنوات مع نهج Go في مشاركة الذاكرة عن طريق الاتصال، وامتلاك روتين Go واحد فقط لكل جزء من البيانات. |
|
|
|
|
|
|
سيمتلك روتين Go واحد حالتنا في هذا المثال، ما يضمن عدم تلف
البيانات بسبب الوصول المتزامن. لقراءة هذه الحالة أو كتابتها،
سترسل روتينات Go الأخرى رسائل إلى الروتين المالك وتتلقى
الردود المقابلة. يغلّف الهيكلان |
|
|
|
|
سنعد، كما سبق، عدد العمليات التي ننفذها. |
|
|
ستستخدم روتينات Go الأخرى القناتين |
|
|
هذا هو روتين Go الذي يمتلك |
|
|
يبدأ هذا تشغيل 100 روتين Go لإصدار طلبات قراءة إلى الروتين
المالك للحالة عبر القناة |
|
|
نبدأ أيضًا 10 روتينات للكتابة باستخدام أسلوب مماثل. |
|
|
دع روتينات Go تعمل لمدة ثانية. |
|
|
احفظ أخيرًا أعداد العمليات واعرضها. |
|
|
يوضح تشغيل برنامجنا أن مثال إدارة الحالة القائم على روتينات Go ينجز نحو 80,000 عملية إجمالًا. |
|
|
في هذه الحالة تحديدًا، كان الأسلوب القائم على روتينات Go أعقد قليلًا من الأسلوب القائم على أقفال الاستبعاد المتبادل. لكنه قد يكون مفيدًا في حالات معينة، مثل وجود قنوات أخرى، أو عندما تكون إدارة عدة أقفال من هذا النوع عرضة للأخطاء. استخدم الأسلوب الذي تجده أكثر ملاءمة، ولا سيما من حيث فهم صحة برنامجك. |
المثال التالي: الفرز.