Muhammad Hewedy
Muhammad Hewedy

@mohewedy

11 تغريدة 15 قراءة Apr 26, 2022
إيه الفرق بين Concurrency و ال Parallelism؟
زي ما عمنا Rob Pike بيقول ...
ال Concurrency هي التعامل مع مجموعة من الأشياء في نفس الوقت
ال Parallelism هي عمل مجموعة من الأشياء في نفس الوقت
تخيل كده صانع القهوه (بارستا) ...
✴️صانع القهوه ممكن يجهز أكتر من كوب في نفس الوقت (Concurrency)
✴️طب لو حابب تعمل scale للموضوع ... ممكن تجيب مكنة قهوه تانيه و تجيب حد تاني يشتغل عليها (Parallelism)
و في العادة ال Concurrency أفضل من ال Parallelism لأنها بتستغل الموارد بشكل أفضل
ففي single core machines ... متقدرش يكون عندك Parallelism .. لكن ممكن يكون عندك Concurrency
و ال Concurrency بتم عن طريق ال multi threading ....
وإذا جينا نتكلم عن ال multi threading ... فأي threads بتتشغل في نظام واحد .. بتحتاج تتواصل مع بعضها
و التواصل ده ممكن يتم بطريقتين ...
و
الطريقة الأولى و هي ال shared-memory model (زي في ال Java)
و في الطريقة دي لازم يكون فيه آليات لل synchronization (أو التزامن) بين ال threads ...
زي ال locks (و أنواعه سواء reentrant أو لا) و semaphore و ال mutex ...
و ده محتاج فهم و إلا مشاكل غير متوقعه ممكن تحصل 🙄
الطريقة التانيه اللي بتستخدم في ال communication بين ال threads هي ال message passing ..
و ممكن ال message passing هنا يتم عن طريقة channels ... أو عن طريقة mailbox لكل thread (actor)
أولا ال channel-based message passing ... و فيها بيكون فيه channels بتكون هي حلقة الوصل بين ال threads و اللي بيتم أن ال threads بترسل لبعضها رسائل على ال channel
و ال channel بتختلف من لغة للغة... و ممكن يكون ليها حجم و نوع بيانات
و لغة golang بتستخدم الطريقة
ثانيا ال mailbox .. و فيها بيكون كل thread ليه mailbox.. و بيتم التواصل بينهم على عنوان ال mailbox .. و كل thread بيقرأ الرسايل من ال mailbox و ممكن يرد عليها ...
لغة erlang و scala akka framework بيستخدمو الطريقة دي
الطريقة التانيه (message passing) دي أكثر أمانا من الطريقة الأولى (shared memory) ...
(لكن لا تخلو من المشاكل لو أستخدمت بدون فهم ... مثلا لو thread Aمنتظر رساله و ال thread B لن يرسل هذه الرساله )
ده مثال لل channel communication بين ال threads في لغة crystal lang

جاري تحميل الاقتراحات...