البرمجة غير المتزامنة في Rust: دليل شامل للمبتدئين

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

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

ابدأ الدورة
```html

مقدمة في البرمجة غير المتزامنة في Rust



البرمجة غير المتزامنة هي نهج يسمح لتطبيقك بتنفيذ مهام متعددة بكفاءة في وقت واحد، دون حظر تيار التنفيذ الرئيسي. في Rust، يتم تنفيذ هذا النهج من خلال نموذج async/await، الذي يضمن أمان الذاكرة والأداء العالي المميزين للغة.



على عكس تعدد الخيوط التقليدي، يعمل الكود غير المتزامن داخل خيط واحد أو عدة خيوط، حيث يتبدل بين المهام أثناء الانتظار (مثل انتظار الإدخال/الإخراج أو طلبات الشبكة). وهذا يجعله مثالياً لبناء خوادم الويب عالية التحميل، وتطبيقات الشبكات، وأدوات معالجة البيانات.



في هذه المقالة، سنشرح أساسيات البرمجة غير المتزامنة في Rust: من المفاهيم الأساسية إلى الأمثلة العملية. ستتعلم كيف تعمل Future و async و await، وستتعرف على بيئة التشغيل الشهيرة Tokio، وستكتب أول مشروع غير متزامن لك.



المفاهيم الأساسية: Future و async و await



ما هو Future؟



في Rust، يتم تمثيل المهمة غير المتزامنة بواسطة trait Future. Future هي قيمة قد لا تكون جاهزة بعد، ولكن سيتم الحصول عليها في المستقبل. كل Future لديه طريقة poll تتحقق مما إذا كانت المهمة قد اكتملت. إذا كانت المهمة لا تزال قيد التنفيذ، يتم إرجاع Pending؛ وإذا اكتملت، يتم إرجاع Ready(value).



بحد ذاته، لا يقوم Future بأي عمل. إنه يصف فقط ما يجب أن يحدث. لتنفيذ الكود غير المتزامن، نحتاج إلى بيئة تشغيل (runtime) — وهي منفذ يقوم باستقصاء Future وإدارة تنفيذها.



الكلمتان المفتاحيتان async و await



الكلمة المفتاحية async تحول الدالة العادية إلى دالة غير متزامنة، والتي تُرجع Future. على سبيل المثال:



async fn hello() -> String {    "مرحباً، أيها العالم!".to_string()}


للحصول على النتيجة من Future، نستخدم .await. إنه يوقف تنفيذ الدالة الحالية حتى يكتمل Future:



let result = hello().await;println!("{}", result);


هام: يمكن استخدام .await فقط داخل دالة غير متزامنة أو كتلة async {}.



دورة حياة المهمة غير المتزامنة



  • إنشاء Future (استدعاء الدالة غير المتزامنة).
  • تمرير Future إلى بيئة التشغيل للتنفيذ.
  • تقوم بيئة التشغيل باستقصاء Future عبر poll.
  • إذا كانت المهمة محظورة (في انتظار I/O)، تتحول بيئة التشغيل إلى مهمة أخرى.
  • عندما تكون النتيجة جاهزة، يُرجع Future القيمة Ready.


النظام البيئي: Tokio و async-std



للعمل مع الكود غير المتزامن في Rust، نستخدم بيئات التشغيل غير المتزامنة. الأكثر شهرة هما Tokio و async-std.



Tokio



Tokio هو المعيار الصناعي للبرمجة غير المتزامنة في Rust. يوفر جدولة متعددة الخيوط، وإدخال/إخراج غير متزامن، ومؤقتات، ومزامنة، وبروتوكولات شبكات. معظم المشاريع الكبيرة (مثل Hyper و Tonic و Axum) مبنية على Tokio.



لبدء العمل مع Tokio، أضف التبعية في Cargo.toml:



[dependencies]tokio = { version = "1", features = ["full"] }


الماكرو الرئيسي لتشغيل الكود غير المتزامن هو #[tokio::main]:



#[tokio::main]async fn main() {    println!("Hello from Tokio!");}


async-std



async-std هي بيئة تشغيل بديلة، تسعى لأن تكون مشابهة قدر الإمكان للمكتبة القياسية في Rust. إنها أبسط للمبتدئين، ولكنها أقل شهرة في بيئات الإنتاج.



مثال

```

المدونات

توصيات الكتب