Grow with AppMaster Grow with AppMaster.
Become our partner arrow ico

Goroutines

Goroutines

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

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

ما هي Goroutines ؟

goroutine هو مؤشر ترابط تنفيذ بسيط في Golang يعمل في نفس الوقت مع بقية البرنامج. تكون Goroutines ميسورة التكلفة عندما تشبه الخيوط القياسية نظرًا لأن تكلفة إنشاء goroutine منخفضة للغاية. لذلك ، يتم استخدامهم على نطاق واسع في Go للبرمجة المتزامنة. يتكون كل برنامج من goroutine واحد على الأقل يعرف باسم goroutine الرئيسي. goroutine الرئيسي يتحكم في جميع goroutines الأخرى ؛ وهكذا ، إذا انتهى goroutine الرئيسي ، فإن جميع goroutines الأخرى في البرنامج النصي تعمل كذلك. يكون Goroutine نشطًا دائمًا في الخلفية.

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

يمكننا إضافة goroutine عن طريق تطبيق الكلمة المفتاحية go على استدعاء الوظيفة. بمجرد تطبيق الكلمة الرئيسية go على المكالمة العاملة ، سنقوم بتعيين التزامن مع الأداء. لكن أولاً ، دعنا نحدد تأثير تطبيق الكلمة المفتاحية go على التنفيذ. لنفكر في وجود نوعين من goroutines في البرنامج. سيكون النص " package main import " هو إدخال البرنامج. في Go ، يعد استيراد الحزمة الرئيسي عبارة استيراد تعريفية. الجوروتين الرئيسي (goroutine first goroutine) ضمني. عندما نقوم بتنفيذ go ( f) ، يتم تشكيل goroutine الثاني (0). عادةً ما ينفذ برنامجنا كل أمر في الوظيفة الأساسية عندما ننفذ وظيفة قبل الانتقال إلى السطر التالي.

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

normal vs goroutine

مزايا Goroutines على الخيوط

تكلفة Goroutines قليلة

تعتبر Goroutines أقل تكلفة من العمليات الأخرى. حجم الكتلة هو بضعة كيلوبايت فقط ، ويمكن أن تتوسع أو تتقلص لتلبية متطلبات البرنامج ، على عكس الخيوط ، التي يجب تحديد حجم مكدسها ويكون دائمًا.

هناك Goroutines متعددة

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

Goroutines باستخدام القنوات

يتحدث Goroutines باستخدام القنوات. تهدف إلى منع مواقف العرق من الحدوث عند مشاركة الذاكرة ذات الصلة. يمكن مقارنة القنوات بقناة يستخدمها goroutines للتفاعل.

ما هي القنوات؟

يمكن أن يتفاعل اثنان من goroutines مع بعضهما البعض وتنسيق عمليتهما عبر القنوات. سيقوم هذا البرنامج بطباعة " ping " بشكل مستمر. لتعيين نموذج قناة ، تكون البادئة " chan " مصحوبة بالعناصر المرسلة على القناة. "في هذه الحالة ، نقدم سلاسل. في القناة ، يتم إرسال الرسائل واستلامها باستخدام عامل التشغيل. يشير" ping "إلى الإرسال أ " ping ".

Try AppMaster no-code today!
Platform can build any web, mobile or backend application 10x faster and 3x cheaper
Start Free

تُستخدم القناة للحفاظ على تزامن الجوروتين. قبل محاولة إرسال رسالة عبر القناة ، سينتظر الموجه حتى تصبح الطابعة جاهزة لقبولها. مصطلح هذا هو تثبيط. عند إنشاء قناة ، يمكن استخدام معلمة ثانية لوظيفة make: c:= make (chan int, 1)

اتجاه القناة

يمكننا تحديد اتجاه نموذج القناة ومعلماته لاستقباله أو إرساله. علامة طريقة Pinger ، على سبيل المثال ، يمكن تغييرها إلى هذا:

func pinger(c chan<- string)

يمكن فقط إرسال C الآن. الاستلام من c سينتج عنه خطأ في الكود. وبالمثل ، قد نقوم بتعديل الإخراج إلى:

func printer(c string -chan)

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

Go-channels

كيف تصنع غوروتين؟

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

عندما ننشئ goroutine جديدًا ، سيتم تنفيذ رمز الترحيب () جنبًا إلى جنب مع الوظيفة الرئيسية (). عندما تقوم بتنفيذ هذا البرنامج ، سوف تفاجأ. يعرض هذا البرنامج نص العملية الرئيسي فقط. ما الذي حدث لأول غوروتين أو غوروتين جديد بدأناه؟ لفهم سبب حدوث ذلك ، يجب علينا أولاً معرفة السمتين الرئيسيتين لـ goroutines.

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

أنت الآن تفهم سبب عدم عمل الكود الخاص بنا. بعد استدعاء to go welcome () ، تم نقل التحكم إلى السطر التالي من التعليمات البرمجية قبل انتظار اكتمال hello goroutine ، وكانت الوظيفة الرئيسية هي الإخراج. توفي goroutine الرئيسي لأنه لم يكن هناك سيناريو لأداءه ، مما منع hello Goroutine من الجري.

استدعينا تقنية النوم ( time.sleep(1 * time.second)) لإيقاف goroutine لمدة ثانية واحدة. وظيفة الترحيب () لديها الآن وقت كافٍ لإكمالها قبل خروج الجروتين الرئيسي. يكتب هذا البرنامج في البداية " welcome goroutine " ثم ينتظر ثانية واحدة قبل طباعة الوظيفة الرئيسية. نستخدم تقنية النوم في الجوروتين الأساسي لإيقافها مؤقتًا للحظة للسماح للجوروتينات الأخرى بإكمالها.

إنشاء Goroutines متعددة

سنبدأ برنامجًا آخر لإنشاء العديد من goroutines. يمكننا أن نبدأ أولاً من خلال إنشاء اثنين من goroutines التي سيتم تنفيذها بالتوازي. هذان goroutines هما goroutines للأرقام [go number ()] و goroutines الأبجدية [ go alphabets ()].

يبقى الرقم goroutine لمدة 250 مللي ثانية قبل طباعة 1 ، ويستقر مرة أخرى قبل طباعة 2 ، وهكذا حتى ينتج 5. وبالمثل ، يعرض goroutine الأبجدي الرقمي الحرف من a إلى e ثم ينتظر 400 مللي ثانية. أخيرًا ، يُنشئ goroutine الأساسي الأعداد الصحيحة والأحرف الأبجدية الرقمية ويتوقف مؤقتًا عن مسار ، ثم ينتهي goroutine الرئيسي.

تكرار أخطاء البرمجة المتزامنة

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

استنتاج

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

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

AppMaster عبارة عن نظام أساسي no-code قادر على إنشاء تطبيقات للهاتف المحمول والويب بالإضافة إلى الواجهة الخلفية. حقيقة مثيرة للاهتمام يقوم AppMaster بإنشاء خلفية عن طريق Go بسرعة 22000 سطر في الثانية ويمكنك الوصول إلى الكود المصدري.

المنشورات ذات الصلة

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

أفضل طريقة لفهم قوة AppMaster هي رؤيتها بنفسك. اصنع تطبيقك الخاص في دقائق مع اشتراك مجاني

اجعل أفكارك تنبض بالحياة