Skip to content

الفصل 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)
    ]
    
    متغير النتائج = انتظر الكل(ملفات)
    اطبع_سطر("تم تحميل " + طول(النتائج) + " ملفات")
نهاية

مُرخَّص بموجب رخصة MIT