0Pricing
Learn Rust Coding · درس

مقدمة إلى Async/Await

تعلّموا أساسيات الدوال `async` وتعبيرات `await` لكتابة شيفرة غير متزامنة وغير حاجزة.

مقدمة إلى Async/Await درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 3 دروس في المجموع.

لماذا البرمجة غير المتزامنة؟

غالبًا ما تتضمن المهام البرمجية الانتظار، مثل انتظار تحميل ملف، أو اكتمال طلب شبكة، أو إرجاع استعلام قاعدة بيانات لنتائجه.

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

عندما تنتظر التعليمات البرمجية...

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

جرّب تشغيله:

use std::thread;
use std::time::Duration;

fn main() {
  println!("Starting a blocking task...");
  thread::sleep(Duration::from_secs(2)); // This blocks!
  println!("Blocking task finished!");
}

تكلفة الانتظار

في المثال السابق، انتظر البرنامج بأكمله. ولو كان هذا خادم ويب، لكان ذلك يعني أنه أثناء انتظار طلب أحد المستخدمين لقاعدة البيانات، لن يتمكن الخادم من خدمة أي مستخدمين آخرين!

تتيح البرمجة غير المتزامنة لبرنامجك بدء مهمة طويلة التنفيذ، ثم الانتقال إلى عمل آخر بدلًا من الانتظار. وعندما تصبح المهمة الطويلة جاهزة، يمكن للبرنامج استئنافها.

نهج Rust غير المتزامن

توفر Rust ميزات لغوية قوية للبرمجة غير المتزامنة، وهي الكلمتان المفتاحيتان async وawait.

  • دوال async هي دوال خاصة يمكن إيقافها مؤقتًا ثم استئنافها.
  • يُستخدم .await داخل دالة async لانتظار اكتمال مهمة غير متزامنة أخرى دون حظر البرنامج بأكمله.

تعريف دوال `async`

تُعلن عن دالة غير متزامنة بإضافة الكلمة المفتاحية async قبل fn. وتُرجع دالة async دائمًا قيمة من النوع Future.

‏Future هي قيمة قد لا تكون جاهزة بعد. وهي تمثل عملية حسابية ستنتج نتيجة في نهاية المطاف.

async fn my_async_task() -> u32 {
  // This task will eventually return 42
  42
}

الإيقاف المؤقت باستخدام `.await`

الكلمة المفتاحية .await هي ما يجعل البرمجة غير المتزامنة غير حاجزة. عند استخدام .await مع Future، ستقوم دالة async بما يلي:

  • إيقاف تنفيذها مؤقتًا.
  • السماح للبرنامج بتنفيذ أعمال أخرى.
  • استئناف التنفيذ عند جاهزية Future المنتظرة.

يشبه ذلك الضغط على زر الإيقاف المؤقت لمهمتك الحالية ريثما تكتمل مهمة أخرى.

تشغيل التعليمات البرمجية غير المتزامنة: المنفّذات

تُرجع دالة async قيمة من النوع Future، لكنها لا تشغّل التعليمات البرمجية الموجودة بداخلها فورًا. إذ إن Futures كسولة.

لتشغيل دالة async فعليًا وتنفيذ Future الخاصة بها، تحتاج إلى منفّذ. في الأمثلة البسيطة، يمكننا استخدام futures::executor::block_on، الذي يشغّل Future حتى اكتمالها على الخيط الحالي.

برنامجك الأول باستخدام `async`/`await`

إليك كيفية عمل async وawait ومنفّذ بسيط معًا. لاحظ كيفية استخدام block_on في main لبدء العملية غير المتزامنة.

يحاكي هذا المثال تأخيرًا غير متزامن دون حظر خيط الدالة main (من الناحية المفاهيمية؛ إذ إن block_on نفسها تحظر التنفيذ حتى اكتمال Future، لكن المهمة غير المتزامنة نفسها تتنازل عن التنفيذ).

use futures::executor::block_on;
use std::time::Duration;

async fn learn_and_wait() {
  println!("Learning asynchronously...");
  // Simulate an async operation that takes time
  // In a real app, this would be an I/O op
  tokio::time::sleep(Duration::from_secs(1)).await;
  println!("Finished learning!");
}

fn main() {
  println!("Starting main function.");
  block_on(learn_and_wait());
  println!("Main function finished.");
}

فهم سمة `Future`

عندما تكتب async fn my_func()، تحوّلها Rust فعليًا إلى آلة حالات تطبّق السمة Future.

تحتوي السمة Future على أسلوب رئيسي واحد هو poll، ويستدعيه المنفّذ بشكل متكرر للتحقق مما إذا كانت المهمة جاهزة لإحراز تقدم. وعند استخدام .await مع Future، فإنها تطلب من المنفّذ استدعاء poll لـ Future أخرى حتى تكتمل.

اختبار سريع: أساسيات Async/Await

لقد تعلمت أساسيات async وawait. لنرَ ما إذا كنت تستطيع تحديد أدوارهما الرئيسية.

مراجعة والخطوات التالية

أحسنت! لقد خطوت خطواتك الأولى في برمجة Rust غير المتزامنة.

  • رأينا أن التعليمات البرمجية المتزامنة تحظر التنفيذ، مما يجعل البرامج تنتظر.
  • تتيح التعليمات البرمجية غير المتزامنة تشغيل المهام بالتزامن دون حظر التنفيذ.
  • تُعلن الكلمة المفتاحية async عن دالة غير متزامنة تُرجع قيمة من النوع Future.
  • تعمل الكلمة المفتاحية .await على إيقاف دالة async مؤقتًا حتى تصبح Future جاهزة.
  • يلزم وجود منفّذ (مثل block_on) لتشغيل Futures.

سنتعمق بعد ذلك في Tokio، وهي بيئة تشغيل ونظام متكامل قويان لبناء تطبيقات Rust غير متزامنة واقعية!

الأسئلة الشائعة

هل درس «مقدمة إلى Async/Await» مجاني؟

نعم — نص درس «مقدمة إلى Async/Await» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 3 دروس في المجموع.

ماذا ستتعلم في «مقدمة إلى Async/Await»؟

تعلّموا أساسيات الدوال `async` وتعبيرات `await` لكتابة شيفرة غير متزامنة وغير حاجزة. تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟

لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.

كم من الوقت يستغرق درس «مقدمة إلى Async/Await»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟

نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مقدمة إلى Async/Await
  2. بناء تطبيقات غير متزامنة باستخدام Tokio
  3. التعامل مع Futures والمهام
← العودة إلى Learn Rust Coding