Rayon لـ Rust: دليل كامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو Rayon ولماذا هو مطلوب؟

\n\n

Rayon هي مكتبة قوية للغة البرمجة Rust، توفر طريقة بسيطة وآمنة لتوزيع العمليات الحسابية بالتوازي. ميزتها الرئيسية هي مفهوم المكررات المتوازية. بدلاً من إدارة الخيوط والأقفال والقنوات يدويًا، يمكنك ببساطة استبدال المكرر التسلسلي (`.iter()`) بمكرر متوازٍ (`.par_iter()`)، ويقوم Rayon تلقائيًا بتوزيع العمل على جميع أنوية المعالج المتاحة.

\n\n

لماذا نحتاج هذه المكتبة؟ في العالم الحديث، أصبحت المعالجات متعددة النوى هي المعيار. ومع ذلك، فإن كتابة كود متعدد الخيوط يدويًا هي مهمة معقدة، محفوفة بسباقات البيانات، والأقفال المتبادلة، وأخطاء أخرى يصعب اكتشافها. يتولى Rayon كل هذه التعقيدات، ويوفر:

\n
    \n
  • توزيع تلقائي للعمل: تقوم المكتبة بنفسها بتحديد كيفية تقسيم البيانات وتوزيعها بين الخيوط.
  • \n
  • أمان على مستوى الأنواع: بفضل نظام الملكية والاقتراض في Rust، يضمن Rayon عدم وجود سباقات بيانات في مرحلة التجميع.
  • \n
  • سرقة العمل (Work-stealing): إذا أنهى أحد الخيوط مهمته قبل الآخرين، فإنه "يسرق" العمل من الخيوط المشغولة، مما يضمن توزيعًا متساويًا للحمل على جميع الأنوية.
  • \n
  • سهولة الاستخدام: واجهة برمجة التطبيقات (API) الخاصة بـ Rayon بديهية لأي مطور ملم بمكررات Rust.
  • \n
\n\n

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

\n\n

التثبيت

\n\n

يتم تثبيت Rayon بالطريقة القياسية لـ Rust - عبر مدير الحزم Cargo. أضف السطر التالي إلى ملف Cargo.toml الخاص بمشروعك:

\n\n
[dependencies]\nrayon = "1.10"
\n\n

بعد ذلك، قم بتنفيذ الأمر cargo build، وسيقوم Cargo تلقائيًا بتنزيل المكتبة وترجمتها. Rayon هي مكتبة Rust "خالصة"، لذلك لا تتطلب أي تبعيات إضافية أو متطلبات نظام. تعمل على أنظمة Windows وmacOS وLinux.

\n\n

بداية سريعة

\n\n

لنبدأ بمثال تقليدي: جمع مصفوفة كبيرة من الأرقام. سنفعل ذلك أولاً بشكل تسلسلي، ثم بالتوازي باستخدام Rayon.

\n\n
// استيراد المكتبة\nuse rayon::prelude::*;\n\nfn main() {\n    // إنشاء متجه كبير من الأرقام\n    let numbers: Vec<u64> = (1..=10_000_000).collect();\n\n    // --- الجمع التسلسلي ---\n    let sequential_start = std::time::Instant::now();\n    let sum_sequential: u64 = numbers.iter().sum();\n    let sequential_duration = sequential_start.elapsed();\n    println!("المجموع التسلسلي: {} (الوقت: {:?})", sum_sequential, sequential_duration);\n\n    // --- الجمع المتوازي باستخدام Rayon ---\n    let parallel_start = std::time::Instant::now();\n    let sum_parallel: u64 = numbers.par_iter().sum(); // استبدلنا .iter() بـ .par_iter()\n    let parallel_duration = parallel_start.elapsed();\n    println!("المجموع المتوازي: {} (الوقت: {:?})", sum_parallel, parallel_duration);\n\n    // مقارنة التسريع\n    println!("التسريع: {:.2}x", sequential_duration.as_secs_f64() / parallel_duration.as_secs_f64());\n}
\n\n

في هذا المثال، قمنا بتغيير واحد فقط: استبدلنا .iter() بـ .par_iter(). قام Rayon تلقائيًا بتقسيم المتجه إلى أجزاء، وتوزيعها على الخيوط، وحساب المجاميع الجزئية، ثم دمج النتائج. على معالج متعدد النوى، ستلاحظ تسريعًا كبيرًا.

\n\n

الطرق/الدوال الرئيسية

\n\n

1. par_iter()

\n

ما يفعله: ينشئ مكررًا متوازيًا من المراجع إلى عناصر المجموعة. هذه هي الطريقة الأكثر ش

توصيات