⚡ التزامن في لغة نفطه (Concurrency)


📚 مقدّمة

توفّر لغة نفطه نموذج تزامن مرن وقوي، يجمع بين:

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

تُوضح هذه الصفحة جميع آليات التزامن من خلال أمثلة عملية كاملة مستمدة من سكربتات الاختبار الرسمية للغة.


1️⃣ المهام غير المتزامنة (Async Tasks)

📌 تعريف دالة غير متزامنة


غير_متزامن دالة مهمة_طويلة_المدى(ثابت بادئة : تسلسل_أحرف ، ثابت نهاية_الحلقة_التكرارية = 100000) {
    ثابت قائمة_النتائج تعيين []

    كرر_حلقة أ تعيين 0 إلى نهاية_الحلقة_التكرارية إفعل {
        ثابت نتيجة = "{{بادئة}}-{{أ}}"
        إطبع(نتيجة)
        قائمة_النتائج::إضافة(أ؛نتيجة)
    }
    أنهي

    ارجع قائمة_النتائج
}

▶️ تشغيل دالة async

ثابت شغل تعيين مهمة_طويلة_المدى("مهمة")

⏳ انتظار نتيجة دالة async

انتظار مهمة_طويلة_المدى("مهمة")

⚠️ مثال غير صالح

ثابت شغل تعيين تشغيل مهمة_طويلة_المدى("مهمة")   --- ❌

✔️ أمثلة صحيحة

ثابت شغل تعيين مهمة_طويلة_المدى("مهمة"؛10)
انتظار شغل

🔢 دمج await مع عمليات أخرى

ثابت نتيجة_شغل تعيين انتظار مهمة_طويلة_المدى("مهمة"؛10) * (انتظار تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1))

ثابت نتيجة_شغل تعيين انتظار مهمة_طويلة_المدى("مهمة"؛10) * 10
نتيجة_شغل

2️⃣ النطاقات (Scopes)

تستخدم النفطه نطاق و نطاق مرتب للتحكم في:

📌 مثال — نطاق عادي

نطاق {
    متغير قائمة_ تعيين [1 , 2 , 3]
    دوال:الحزم::تعيين_عنصر(قائمة_, 1 , 99)
    تشغيل قائمة_
}

📌 مثال — نطاق مرتب

نطاق مرتب {
    مهمة_طويلة_المدى("مهمة-1"؛2)
    مهمة_طويلة_المدى("مهمة-2"؛10)
    مهمة_طويلة_المدى("مهمة-3"؛15)
}

3️⃣ دوال الحزم: الحصول على عنصر وتعديل عنصر

تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1)
دوال:الحزم::تعيين_عنصر(قائمة_, 1, 99)

🧩 مثال كامل مع تكرارات متعددة ونطاقات متداخلة

--- تشغيل مهمة غير متزامنة للحصول على عنصر من قائمة
--- إطلاق مهمة
ثابت شغل تعيين تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1)
--- انتظار انتهاء المهمة
انتظار شغل

--- بداية نطاق مستقل
نطاق {
--- إنشاء قائمة جديدة داخل النطاق
متغير قائمة_ تعيين [1 , 2 , 3]
--- تعديل العنصر رقم 1 إلى 99
دوال:الحزم::تعيين_عنصر(قائمة_, 1 , 99)
--- طباعة/تشغيل القائمة بعد التعديل
تشغيل قائمة_

--- إنشاء مجموعة جديدة
متغير مجموعة_ تعيين {1 , 2}
--- تعديل العنصر الثاني في المجموعة
دوال:الحزم::تعيين_عنصر(مجموعة_, 1 , 99)
--- طباعة المجموعة
تشغيل مجموعة_

--- تشغيل دالة الحصول على عنصر من قائمة مؤقتة
تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1)
--- الحصول على عنصر من تركيبة (Tuple)
دوال:الحزم::حصول_على_عنصر((1 , 2), 1)
--- الحصول على عنصر من مجموعة
تشغيل دوال:الحزم::حصول_على_عنصر({1 , 2}, 1)

--- نطاق متداخل (بدأ التكرار 1)
نطاق {
متغير قائمة_ تعيين [1 , 2 , 3]
دوال:الحزم::تعيين_عنصر(قائمة_, 1 , 99)
تشغيل قائمة_

متغير مجموعة_ تعيين {1 , 2}
دوال:الحزم::تعيين_عنصر(مجموعة_, 1 , 99)
تشغيل مجموعة_

تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1)
دوال:الحزم::حصول_على_عنصر((1 , 2), 1)
تشغيل دوال:الحزم::حصول_على_عنصر({1 , 2}, 1)

--- نطاق متداخل (بدأ التكرار 2)
نطاق {
متغير قائمة_ تعيين [1 , 2 , 3]
دوال:الحزم::تعيين_عنصر(قائمة_, 1 , 99)
تشغيل قائمة_

متغير مجموعة_ تعيين {1 , 2}
دوال:الحزم::تعيين_عنصر(مجموعة_, 1 , 99)
تشغيل مجموعة_

تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1)
دوال:الحزم::حصول_على_عنصر((1 , 2), 1)
تشغيل دوال:الحزم::حصول_على_عنصر({1 , 2}, 1)

--- نطاق متداخل (بدأ التكرار 3)
نطاق {
متغير قائمة_ تعيين [1 , 2 , 3]
دوال:الحزم::تعيين_عنصر(قائمة_, 1 , 99)
تشغيل قائمة_

متغير مجموعة_ تعيين {1 , 2}
دوال:الحزم::تعيين_عنصر(مجموعة_, 1 , 99)
تشغيل مجموعة_

تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1)
دوال:الحزم::حصول_على_عنصر((1 , 2), 1)
تشغيل دوال:الحزم::حصول_على_عنصر({1 , 2}, 1)

--- نطاق متداخل (بدأ التكرار 4)
نطاق {
متغير قائمة_ تعيين [1 , 2 , 3]
دوال:الحزم::تعيين_عنصر(قائمة_, 1 , 99)
تشغيل قائمة_

متغير مجموعة_ تعيين {1 , 2}
دوال:الحزم::تعيين_عنصر(مجموعة_, 1 , 99)
تشغيل مجموعة_

تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1)
دوال:الحزم::حصول_على_عنصر((1 , 2), 1)
تشغيل دوال:الحزم::حصول_على_عنصر({1 , 2}, 1)

--- نطاق متداخل (بدأ التكرار 5)
نطاق {
متغير قائمة_ تعيين [1 , 2 , 3]
دوال:الحزم::تعيين_عنصر(قائمة_, 1 , 99)
تشغيل قائمة_

متغير مجموعة_ تعيين {1 , 2}
دوال:الحزم::تعيين_عنصر(مجموعة_, 1 , 99)
تشغيل مجموعة_

تشغيل دوال:الحزم::حصول_على_عنصر([1 , 2 , 3], 1)
دوال:الحزم::حصول_على_عنصر((1 , 2), 1)
تشغيل دوال:الحزم::حصول_على_عنصر({1 , 2}, 1)
}
}
}
}
}
}

4️⃣ القنوات (Channels)

تُستخدم القنوات لإرسال واستقبال الرسائل بين المهام المتوازية.

📌 إنشاء قناة

قناة قناة_مشتركة

5️⃣ الممثلون (Actors)

الممثل هو وحدة تنفيذ تستقبل رسائل وتنفذ منطقًا عند استقبالها.

📌 أمثلة على ممثلين


ممثل طابعة(رسالة_الطابعة){
    إطبع(رسالة_الطابعة)
}

ممثل طابعة {
    إطبع(رسالة_الممثل)
}

ممثل طابعة(رسالة_الطابعة,
(متغير الاسم تعيين "طابعة")
){
    إطبع("{{الاسم}} : {{رسالة_الطابعة}}")
}

ممثل طابعة(
(متغير الاسم تعيين "طابعة",
 متغير عدد_الرسائل تعيين 0)
){
عدد_الرسائل++
إطبع("اسم الممثل: {{الاسم}} - رسالة عدد: {{عدد_الرسائل}} - الرسالة: {{رسالة_الممثل}}")
}


6️⃣ المنتج–المستهلك (Producer / Consumer)

📌 producer


غير_متزامن دالة منتج(ثابت قناة_ ، ثابت نهاية_الحلقة_التكرارية = 100000) {
    كرر_حلقة أ تعيين 0 إلى نهاية_الحلقة_التكرارية إفعل {
        قناة_::إرسال("منتج أرسل رسالة عدد {{أ}}")
    }
    أنهي
}

📌 consumer

دالة مستهلك(ثابت قناة_ ، ثابت طابعة ، ثابت نهاية_الحلقة_التكرارية = 100000) {
    كرر_حلقة أ تعيين 0 إلى نهاية_الحلقة_التكرارية إفعل {
        ثابت رسالة = قناة_::الاستلام()
        طابعة::إرسال(رسالة)
    }
    أنهي
}

▶️ تشغيلهما معًا

نطاق {
    منتج(قناة_مشتركة؛10)
    تشغيل مستهلك(قناة_مشتركة؛طابعة؛10)
}

💡 ملاحظات

يوفّر نموذج التزامن في لغة نفطه أدوات قوية ومتكاملة:

كل هذا بأسلوب بسيط وقوي في نفس الوقت، ممّا يجعل نفطه لغة مناسبة لبناء أنظمة متوازية، تفاعلية، ورسائلية (message-driven).


## 📁 ملفات مرتبطة * [Home - الرئيسية](./../../../README.md) * [🔑 الكلمات المفتاحية - Keywords](./01_keywords.md) * [🧱 الأنواع الأولية و الثوابت و المتغيرات - Primitive Types And Variables](./02_primitives_and_variables.md) * [📚 بُنى المعطيات - Collections](./03_collections.md) * [🧮 التعبيرات - Expressions](./04_expressions.md) * [🔢 الأعداد بأنظمة العد - Radix Numbers](./05_radix_numbers.md) * [📦 تعريف الكائنات - Objects](./06_objects.md) * [🌀 التحكم في تدفق البرنامج - Control Flow](./07_control_flow.md) * [⚙️ الدوال في لغة نفطه - Functions](./08_functions.md) * [⚙️ التوافق مع Java (Java Interop) في لغة نفطه - Java Interop](./09_java_interop.md) * [⏱️ الزمن والنقاط الزمنية في نفطه – Temporal](./11_temporal.md) ---