"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > GO: التزامن مقابل التوازي للدمى.

GO: التزامن مقابل التوازي للدمى.

تم النشر بتاريخ 2024-09-01
تصفح:212

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

دعونا نتخيل المطبخ:

طهي طبق: يمثل هذا مهمة.
طباخ: هو المعالج.
التزامن:

عدة طباخين في المطبخ: كل واحد يقوم بإعداد طبق مختلف.
In Go: سيكون كل طباخ بمثابة روتين. على الرغم من أن المطبخ (المعالج) يحتوي على فرن واحد فقط، إلا أن الطهاة يمكنهم العمل على أطباقهم في وقت واحد، وقضاء الوقت في مهام أخرى أثناء انتظار توفر الفرن.
التوازي:

أفران مختلفة: كل طباخ له فرنه الخاص.
In Go: إذا كان لدينا معالجات فيزيائية متعددة، فيمكن تشغيل كل goroutine على معالج مختلف، وطهي العديد من الأطباق في نفس الوقت في الحياة الواقعية.

ما الفرق؟

التزامن: يتم تنفيذ المهام بشكل متشابك، مما يعطي وهم التوازي، حتى على معالج واحد.
التوازي: يتم تشغيل المهام في وقت واحد على معالجات متعددة، مما يؤدي إلى تسريع العملية بشكل ملحوظ.

كيفية استخدامها في Go؟

Goroutines: فهي مثل الخيوط الخفيفة. لإنشاء روتين goroutine، نستخدم ببساطة الكلمة الأساسية go قبل الوظيفة:

GO: Concurrencia vs Paralelismo Para Tontos.

دعونا نرى مثالاً لكيفية استخدام goroutines في golang:

go func() {
    // Código que se ejecutará en una goroutine
}()

القنوات: هذه هي الأنابيب التي يمكن لـ goroutines التواصل والمزامنة من خلالها.
تخيل أنها عبارة عن أنابيب لتمرير المكونات بين الطباخين

ch := make(chan int)
go func() {
    ch 



مثال عملي:

package main

import (
    "fmt"
    "time"
)

func worker(id int, c chan int) {
    for n := range c {
        fmt.Printf("Worker %d received %d\n", id, n)
        time.Sleep(time.Second)
    }
}

func main() {
    c := make(chan int)

    for i := 1; i 



مخرجات هذا الكود ستكون

Worker 1 received 1
Worker 2 received 2
Worker 3 received 3
Worker 4 received 4
Worker 5 received 5
Worker 1 received 6
Worker 2 received 7
Worker 3 received 8
Worker 4 received 9
Worker 5 received 10

رغم أنه في بعض الأحيان قد يبدو هكذا

Worker 5 received 1
Worker 1 received 3
Worker 2 received 2
Worker 4 received 5
Worker 3 received 4
Worker 3 received 6
Worker 5 received 10
Worker 2 received 8
Worker 4 received 7
Worker 1 received 9

أو مثل هذا

Worker 5 received 1
Worker 1 received 2
Worker 2 received 3
Worker 3 received 4
Worker 4 received 5
Worker 1 received 6
Worker 2 received 7
Worker 3 received 8
Worker 5 received 9
Worker 4 received 10

لماذا يتغير الإخراج في كل مرة أقوم فيها بتشغيل البرنامج؟

يرجع السبب الرئيسي وراء تغير مخرجات البرنامج مع كل عملية تنفيذ إلى الطبيعة غير الحتمية للتزامن.

إليك تفاصيل ما يحدث:

إنشاء قناة: make(chan int) ينشئ قناة للأعداد الصحيحة. سيتم استخدام هذه القناة للتواصل بين goroutines.

بدء goroutines: الحلقة الخاصة بـ i := 1; أنا تتلقى وظيفة العامل المعرف والقناة.

إرسال القيم إلى القناة: الحلقة لـ n := 1; ن 1 إلى 10 إلى القناة.

إغلاق القناة: يقوم استدعاء الإغلاق (c) بإغلاق القناة، مما يشير إلى أنه لن يتم إرسال المزيد من القيم.

تلقي القيم من القناة: يتلقى كل goroutine القيم من القناة باستخدام حلقة for n := range c. عند استلام قيمة، تتم طباعتها على وحدة التحكم.

انتظر حتى تنتهي goroutines: يضمن استدعاء time.Sleep(time.Second) أن ينتظر goroutine الرئيسي انتهاء goroutines الأخرى قبل الخروج.

حتى الآن:

نقوم بإنشاء 5 goroutines (طهاة) يستقبلون الأرقام من خلال قناة.
نرسل الأرقام إلى القناة ليقوم الطهاة بمعالجتها.
يعمل الطهاة بشكل متزامن، ويقومون بمعالجة الأرقام عند استلامها.

لماذا نستخدم التزامن والتوازي في Go؟

أداء أفضل: خاصة في المهام المرتبطة بالإدخال/الإخراج (مثل قراءة الملفات أو تقديم طلبات HTTP).
زيادة الاستجابة: يمكن للتطبيق الاستمرار في الاستجابة للطلبات الأخرى أثناء حظر المهمة.
بنيات أكثر قابلية للتطوير: يمكنك توزيع العمل عبر مراكز أو أجهزة متعددة.

يتذكر!

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

هل تريد التعمق في موضوع معين؟

يمكننا استكشاف مفاهيم مثل:

المزامنة: كائنات المزامنة ومجموعات العمل وما إلى ذلك.
أنماط التزامن: المنتج والمستهلك، وخطوط الأنابيب، وما إلى ذلك.
الاختبار المتزامن: كيفية اختبار التعليمات البرمجية المتزامنة بشكل فعال.

تحيات،
لوكاتوني راوداليس

X/تويتر
جيثب

بيان الافراج تم نشر هذه المقالة على: https://dev.to/lucatonyraudales/go-concurrencia-vs-paralelismo-para-tontos-2fnn?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3