تعرف على كيفية قيام goroutines والقنوات بتمكين التزامن الفعال في برامج Go.

يعد التزامن جانبًا حاسمًا في تطوير البرامج الحديثة لأنه يمكّن البرامج من التعامل بكفاءة مع مهام متعددة في وقت واحد. يمكنك كتابة البرامج التي تنفذ عمليات مختلفة تؤدي إلى تحسين الأداء والاستجابة واستخدام الموارد.

يعد التزامن إحدى الميزات المسؤولة عن اعتماد Go السريع. يعتبر دعم Go المدمج للبرمجة المتزامنة أمرًا سهلاً بينما يساعد في تجنب المزالق الشائعة مثل ظروف السباق والمآزق.

التزامن في Go

يوفر Go دعمًا قويًا للتزامن من خلال آليات مختلفة ، وكلها متوفرة في مكتبتها القياسية وسلسلة الأدوات. برامج Go تحقيق التزامن من خلال goroutines والقنوات.

تعتبر Goroutines خفيفة الوزن ، وتقوم بشكل مستقل بتنفيذ الوظائف التي تعمل بشكل متزامن مع goroutines الأخرى داخل نفس مساحة العنوان. يسمح Goroutines للمهام المتعددة بالتقدم بشكل متزامن دون إدارة صريحة لمؤشر الترابط. تعد Goroutines أخف من خيوط نظام التشغيل ويمكن لـ Go تشغيل الآلاف أو حتى الملايين من goroutines في وقت واحد.

القنوات هي آلية الاتصال للتنسيق وتبادل البيانات بين goroutines. القناة هي قناة مكتوبة تسمح للجوروتين بإرسال واستقبال القيم. توفر القنوات المزامنة لضمان مشاركة آمنة للبيانات بين goroutines مع منع ظروف السباق ومشكلات التزامن الشائعة الأخرى.

instagram viewer

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

كيفية استخدام Goroutines لتنفيذ التعليمات البرمجية المتزامنة

وقت تشغيل Go يدير goroutines. تتمتع Goroutines بمكدسها ، مما يسمح لها بالحصول على بصمة خفيفة الوزن مع حجم مكدس أولي يبلغ بضعة كيلوبايت.

يتم مضاعفة Goroutines على العديد من سلاسل عمليات OS بواسطة وقت تشغيل Go. يقوم برنامج جدولة وقت التشغيل Go بجدولها على سلاسل الرسائل المتاحة عن طريق توزيع عبء العمل بكفاءة ، مما يسمح بالتنفيذ المتزامن للعديد من goroutines على عدد أقل من سلاسل عمليات OS.

إنشاء goroutines هو أمر بسيط ومباشر. ستستخدم ملف يذهب الكلمة الرئيسية متبوعة باستدعاء وظيفي للإعلان عن goroutines.

funcرئيسي() {
يذهب الوظيفة 1 () // إنشاء وتنفيذ goroutine للوظيفة 1
يذهب الوظيفة 2 () // إنشاء وتنفيذ goroutine للوظيفة 2

// ...
}

funcوظيفة 1() {
// كود الوظيفة 1
}

funcوظيفة 2() {
// كود الوظيفة 2
}

عندما يستدعي البرنامج الوظيفة 1 () و الوظيفة 2 () مع ال يذهب الكلمة الرئيسية ، وقت تشغيل Go ينفذ الوظائف بشكل متزامن مثل goroutines.

في ما يلي مثال على استخدام goroutine الذي يطبع نصًا إلى وحدة التحكم:

طَرد رئيسي

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

funcprintText() {
ل أنا: = 1; أنا <= 5; أنا ++ {
FMT. Println ("طباعة النص"، أنا)
وقت. ينام(1 * وقت. ثانية)
}
}

funcرئيسي() {
يذهب printText () // ابدأ في goroutine لتنفيذ وظيفة printText بشكل متزامن

// أداء مهام أخرى في goroutine الرئيسي
ل أنا: = 1; أنا <= 5; أنا ++ {
FMT. Println ("أداء مهام أخرى"، أنا)
وقت. ينام(500 * وقت. ميلي ثانية)
}

// انتظر حتى ينتهي goroutine
وقت. ينام(6 * وقت. ثانية)
}

ال printText تقوم الوظيفة بطباعة بعض النصوص بشكل متكرر إلى وحدة التحكم باستخدام ملف ل حلقة يتم تشغيلها خمس مرات بعد تأخير لمدة ثانية واحدة بين كل عبارة مع حزمة الوقت.

ال رئيسي وظيفة تبدأ goroutine عن طريق الاتصال اذهب printText، الذي يطلق printText تعمل كجروتين منفصل متزامن يسمح للوظيفة بالتنفيذ بشكل متزامن مع بقية الكود في رئيسي وظيفة.

أخيرًا ، للتأكد من عدم خروج البرنامج قبل امتداد printText ينتهي goroutine ، و وقت. ينام وظيفة توقف goroutine الرئيسي لمدة ست ثوان. في سيناريوهات العالم الحقيقي ، يمكنك استخدام آليات المزامنة مثل القنوات أو مجموعات الانتظار لتنسيق تنفيذ goroutines.

استخدام القنوات للاتصال والتزامن

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

يمكنك التفكير في القنوات كخطوط أنابيب لتدفق البيانات بين goroutines. يمكن لأحد goroutine إرسال قيمة إلى القناة ، ويمكن لـ goroutine آخر تلقي هذه القيمة من القناة. تضمن هذه الآلية أن تبادل البيانات آمن ومتزامن.

ستستخدم ملف المشغل لإرسال واستقبال البيانات عبر القنوات.

فيما يلي مثال يوضح الاستخدام الأساسي للقنوات للاتصال بين اثنين من goroutines:

funcرئيسي() {
// إنشاء قناة غير مخزنة من نوع السلسلة
الفصل: = يصنع(تشانخيط)

// Goroutine 1: يرسل رسالة إلى القناة
يذهبfunc() {
الفصل "مرحبا ، القناة!"
}()

// Goroutine 2: يتلقى الرسالة من القناة
msg: = FMT. Println (msg) // الإخراج: مرحبًا ، القناة!
}

القناة في رئيسي الوظيفة هي قناة غير مخزنة مسماة الفصل تم إنشاؤه باستخدام يصنع() وظيفة. أول goroutine يرسل الرسالة "Hello، Channel!" في القناة باستخدام عامل التشغيل ، ويستقبل goroutine الثاني الرسالة من القناة باستخدام نفس المشغل. وأخيرا، فإن رئيسي وظيفة طباعة الرسالة المستلمة إلى وحدة التحكم.

يمكنك تحديد القنوات المكتوبة. ستحدد نوع القناة عند الإنشاء. إليك مثال يوضح استخدام أنواع مختلفة من القنوات:

funcرئيسي() {
// قناة غير مخزنة
الفصل 1: = يصنع(تشانint)

// قناة مخزنة بسعة 3
الفصل 2: ​​= يصنع(تشانخيط, 3)

// إرسال واستقبال القيم من القنوات
الفصل 1 42// أرسل قيمة إلى ch1
القيمة 1: = // تلقي قيمة من ch1

الفصل 2 "مرحبًا"// أرسل قيمة إلى ch2
القيمة 2: = // تلقي قيمة من ch2
}

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

يمكنك استخدام القنوات كآليات مزامنة لتنسيق تنفيذ goroutine من خلال الاستفادة من طبيعة الحظر لعمليات القناة.

funcرئيسي() {
الفصل: = يصنع(تشانمنطقي)

يذهبfunc() {
FMT. Println ("غوروتين 1")
الفصل حقيقي// إكمال الإشارة
}()

يذهبfunc() {
// انتظر إشارة الاكتمال من Goroutine 1
FMT. Println ("Goroutine 2")
}()

// انتظر إشارة الاكتمال من Goroutine 2
FMT. Println ("الجوروتين الرئيسي")
}

ال الفصل القناة منطقية. يعمل اثنان من goroutines في وقت واحد في رئيسي وظيفة. يشير Goroutine 1 إلى اكتماله عن طريق إرسال ملف حقيقي قيمة في القناة الفصل. ينتظر Goroutine 2 إشارة الإكمال من خلال تلقي قيمة من القناة. أخيرًا ، ينتظر goroutine الرئيسي إشارة الإنجاز من goroutine الثاني.

يمكنك بناء تطبيقات الويب في Go with Gin

يمكنك إنشاء تطبيقات ويب عالية الأداء في Go with Gin مع الاستفادة من ميزات التزامن في Go.

يمكنك استخدام Gin للتعامل مع توجيه HTTP والبرمجيات الوسيطة بكفاءة. استفد من دعم التزامن المدمج في Go من خلال استخدام goroutines والقنوات لمهام مثل استعلامات قاعدة البيانات أو مكالمات API أو عمليات الحظر الأخرى.