الفصل 33: البرمجة المتزامنة
مقدمة
البرمجة المتزامنة تسمح بتنفيذ عدة مهام في نفس الوقت، مما يحسن الأداء بشكل كبير.
المفاهيم الأساسية
التزامن مقابل التوازي
| المفهوم | الوصف |
|---|---|
| التزامن (Concurrency) | إدارة عدة مهام بالتبادل |
| التوازي (Parallelism) | تنفيذ عدة مهام فعلياً في نفس اللحظة |
الدوال غير المتزامنة
sad
غير_متزامن دالة تحميل_بيانات(رابط)
اطبع_سطر("جاري التحميل من: " + رابط)
متغير بيانات = انتظر جلب(رابط)
ارجع بيانات
نهاية
غير_متزامن دالة رئيسية()
متغير نتيجة = انتظر تحميل_بيانات("https://api.example.com/data")
اطبع_سطر("البيانات: " + نتيجة)
نهايةالتنفيذ المتوازي
تنفيذ عدة مهام معاً
sad
غير_متزامن دالة جلب_كل_البيانات()
متغير مستخدمين = تحميل_بيانات("/users")
متغير منتجات = تحميل_بيانات("/products")
متغير طلبات = تحميل_بيانات("/orders")
# انتظار الكل معاً
متغير النتائج = انتظر الكل([مستخدمين، منتجات، طلبات])
اطبع_سطر("تم تحميل " + طول(النتائج) + " مصادر")
ارجع النتائج
نهايةالتعامل مع الأخطاء في البرمجة المتزامنة
sad
غير_متزامن دالة تحميل_آمن(رابط)
حاول
متغير بيانات = انتظر جلب(رابط)
ارجع {"نجاح": صحيح، "بيانات": بيانات}
امسك (خطأ)
ارجع {"نجاح": خطأ، "خطأ": خطأ}
نهاية
نهاية
غير_متزامن دالة رئيسية()
متغير نتيجة = انتظر تحميل_آمن("https://api.example.com")
إذا (نتيجة["نجاح"])
اطبع_سطر("تم: " + نتيجة["بيانات"])
وإلا
اطبع_سطر("فشل: " + نتيجة["خطأ"])
نهاية
نهايةالمولدات غير المتزامنة
sad
غير_متزامن مولد دالة تدفق_بيانات(روابط)
لكل رابط في روابط
متغير بيانات = انتظر جلب(رابط)
أنتج بيانات
نهاية
نهايةأنماط شائعة
نمط إعادة المحاولة
sad
غير_متزامن دالة مع_إعادة_محاولة(عملية، محاولات)
لكل م في مدى(1، محاولات)
حاول
ارجع انتظر عملية()
امسك (خطأ)
إذا (م == محاولات)
ارمي خطأ
نهاية
اطبع_سطر("محاولة " + م + " فشلت، إعادة المحاولة...")
نهاية
نهاية
نهايةتمرين
aكتب برنامجاً يحاكي تحميل 5 ملفات بالتوازي مع شريط تقدم:
الحل
sad
غير_متزامن دالة تحميل_ملف(اسم، حجم)
اطبع_سطر("⬇ بدء تحميل: " + اسم)
# محاكاة التحميل
لكل م في مدى(1، حجم)
# انتظار محاكاة
نهاية
اطبع_سطر("✓ اكتمل: " + اسم)
ارجع اسم
نهاية
غير_متزامن دالة رئيسية()
متغير ملفات = [
تحميل_ملف("صورة.png"، 100)،
تحميل_ملف("فيديو.mp4"، 500)،
تحميل_ملف("مستند.pdf"، 50)،
تحميل_ملف("موسيقى.mp3"، 200)،
تحميل_ملف("أرشيف.zip"، 300)
]
متغير النتائج = انتظر الكل(ملفات)
اطبع_سطر("تم تحميل " + طول(النتائج) + " ملفات")
نهاية