البرمجة غير المتزامنة هي مفهوم مهم يجب أن تكون على دراية به كمطور Rust.

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

تسمح لك البرمجة غير المتزامنة بكتابة رمز غير محظور يستخدم موارد النظام بشكل فعال. من خلال الاستفادة من البرمجة غير المتزامنة ، يمكنك تصميم تطبيقات تؤدي مهام متعددة. تعد البرمجة غير المتزامنة سهلة الاستخدام للتعامل مع العديد من طلبات الشبكة أو معالجة كميات كبيرة من البيانات دون إعاقة تدفق التنفيذ.

البرمجة غير المتزامنة في الصدأ

يتيح لك نموذج البرمجة غير المتزامن لـ Rust القيام بذلك كتابة كود Rust فعال يعمل بشكل متزامن دون إعاقة تدفق التنفيذ. تعد البرمجة غير المتزامنة مفيدة عند التعامل مع عمليات الإدخال / الإخراج وطلبات الشبكة والمهام التي تتضمن انتظار الموارد الخارجية.

يمكنك تنفيذ البرمجة غير المتزامنة في تطبيقات Rust بعدة طرق. يتضمن ذلك ميزات اللغة والمكتبات ووقت تشغيل Tokio.

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

instagram viewer

مفاهيم البرمجة غير المتزامنة لـ Rust

توفر العقود الآجلة أساسًا للبرمجة غير المتزامنة في Rust. يمثل المستقبل عملية حسابية غير متزامنة لم يتم تنفيذها بالكامل.

العقود الآجلة كسولة (يتم تنفيذها فقط عند الاقتراع). عندما تستدعي المستقبل تصويت() الطريقة ، تتحقق مما إذا كان المستقبل قد اكتمل أو يحتاج إلى عمل إضافي. إذا لم يكن المستقبل جاهزًا ، فسيعود استطلاع:: معلق، مما يشير إلى أنه يجب جدولة المهمة لتنفيذها لاحقًا. إذا كان المستقبل جاهزًا ، فسيعود استطلاع:: جاهز بالقيمة الناتجة.

تتضمن سلسلة الأدوات القياسية لـ Rust بدائل I / O غير متزامنة ، وإصدار غير متزامن لملف I / O ، والشبكات ، وأجهزة ضبط الوقت. تسمح لك هذه العناصر الأولية بإجراء عمليات الإدخال / الإخراج بشكل غير متزامن. يساعد هذا في تجنب حظر تنفيذ البرنامج أثناء انتظار اكتمال مهام الإدخال / الإخراج.

يسمح لك بناء الجملة غير المتزامن / انتظار بكتابة تعليمات برمجية غير متزامنة تشبه التعليمات البرمجية المتزامنة. هذا يجعل التعليمات البرمجية الخاصة بك بديهية وسهلة الصيانة.

يؤكد نهج Rust في البرمجة غير المتزامنة على السلامة والأداء. تضمن قواعد الملكية والاقتراض سلامة الذاكرة وتمنع مشكلات التزامن الشائعة. توفر البنية غير المتزامنة / الانتظار والعقود الآجلة طريقة بديهية للتعبير عن تدفقات العمل غير المتزامنة. يمكنك استخدام وقت تشغيل طرف ثالث لإدارة المهام من أجل التنفيذ الفعال.

يمكنك الجمع بين ميزات اللغة والمكتبات ووقت التشغيل لكتابة تعليمات برمجية عالية الأداء. يوفر إطارًا قويًا ومريحًا لبناء أنظمة غير متزامنة. هذا يجعل Rust خيارًا شائعًا للمشاريع التي تتطلب معالجة فعالة للمهام المرتبطة بالإدخال / الإخراج والتزامن العالي.

لا يدعم إصدار Rust 1.39 والإصدارات الأحدث العمليات غير المتزامنة في مكتبة Rust القياسية. ستحتاج إلى صندوق تابع لجهة خارجية لاستخدام ملف غير متزامن/انتظر بناء الجملة للتعامل مع العمليات غير المتزامنة في Rust. يمكنك استخدام حزم الطرف الثالث مثل طوكيو أو غير متزامن الأمراض المنقولة جنسيا للعمل مع بناء الجملة غير المتزامن / انتظار.

البرمجة غير المتزامنة مع Tokio

Tokio هو وقت تشغيل غير متزامن قوي لـ Rust. يوفر وظائف لبناء تطبيقات عالية الأداء وقابلة للتطوير. يمكنك الاستفادة من قوة البرمجة غير المتزامنة مع Tokio. كما يوفر ميزات للتوسعة.

في جوهر Tokio هو نموذجها غير المتزامن لجدولة المهام وتنفيذها. يسمح لك Tokio بكتابة تعليمات برمجية غير متزامنة باستخدام الصيغة غير المتزامنة / انتظار. يتيح ذلك استخدام موارد النظام بكفاءة وتنفيذ المهام المتزامنة. حلقة حدث Tokio تدير جدولة المهام بكفاءة. وهذا يضمن الاستخدام الأمثل لأنوية وحدة المعالجة المركزية ويقلل من عبء تبديل السياق.

أدوات دمج Tokio تجعل تنسيق المهام وتكوينها أمرًا سهلاً. يوفر Tokio تنسيقًا قويًا للمهام وأدوات التكوين. يمكنك الانتظار حتى تكتمل مهام متعددة بالانضمام ، حدد المهمة المكتملة الأولى مع مهام التحديد والسباق ضد بعضها البعض مع السباق.

أضف ال طوكيو قفص لك Cargo.toml قسم تبعيات الملف.

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

إليك كيفية استخدام صيغة async / wait في برامج Rust مع Tokio:

use tokio:: time:: sleep;
use std:: time:: Duration;

asyncfnhello_world() {
println!("Hello, ");
sleep(Duration:: from_secs(1)).await;
println!("World!");
}

#[tokio:: main]
asyncfnmain() {
hello_world().await;
}

ال مرحبا بالعالم الوظيفة غير متزامنة ، لذا يمكنها استخدام امتداد انتظر الكلمة الأساسية لإيقاف تنفيذها مؤقتًا حتى يتم حل المستقبل. ال مرحبا بالعالم يطبع وظيفة "مرحبًا، " إلى وحدة التحكم. ال المدة:: from_secs (1) وظيفة استدعاء يوقف تنفيذ الوظيفة لمدة ثانية. ال انتظر الكلمة الرئيسية تنتظر اكتمال النوم في المستقبل. وأخيرا، فإن مرحبا بالعالم يطبع وظيفة "عالم!" إلى وحدة التحكم.

ال رئيسي الوظيفة هي وظيفة غير متزامنة مع # [tokio:: main] يصف. يعين الوظيفة الرئيسية كنقطة دخول لوقت تشغيل طوكيو. ال hello_world (). انتظر ينفذ وظيفة hello_world بشكل غير متزامن.

مهام تأخير مع طوكيو

تستخدم المهمة السائدة في البرمجة غير المتزامنة التأخيرات أو جدولة المهام للتشغيل في نطاق زمني محدد. يوفر وقت تشغيل tokio آلية لاستخدام أجهزة ضبط الوقت غير المتزامنة والتأخيرات من خلال ملف طوكيو:: الوقت وحدة.

إليك كيف يمكنك تأخير عملية باستخدام وقت تشغيل Tokio:

use std:: time:: Duration;
use tokio:: time:: sleep;

asyncfndelayed_operation() {
println!("Performing delayed operation...");
sleep(Duration:: from_secs(2)).await;
println!("Delayed operation completed.");
}

#[tokio:: main]
asyncfnmain() {
println!("Starting...");
delayed_operation().await;
println!("Finished.");
}

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

معالجة الأخطاء في البرامج غير المتزامنة

تتضمن معالجة الخطأ في كود Rust غير المتزامن استخدام الامتداد نتيجة اكتب و التعامل مع أخطاء الصدأ مع ال ? المشغل أو العامل.

use tokio:: fs:: File;
use tokio:: io;
use tokio:: io::{AsyncReadExt};

asyncfnread_file_contents() -> io::Result<String> {
letmut file = File:: open("file.txt").await?;
letmut contents = String::new();
file.read_to_string(&mut contents).await?;
Ok(contents)
}

asyncfnprocess_file() -> io::Result {
let contents = read_file_contents().await?;
// Process the file contents
Ok(())
}

#[tokio:: main]
asyncfnmain() {
match process_file().await {
Ok(()) => println!("File processed successfully."),
Err(err) => eprintln!("Error processing file: {}", err),
}
}

ال قراءة_ملفات_المحتوى ترجع الدالة io:: النتيجة يمثل احتمال حدوث خطأ في الإدخال / الإخراج. باستخدام ملف ? عامل التشغيل بعد كل عملية غير متزامنة ، سينشر وقت تشغيل Tokio أخطاء في مكدس الاستدعاءات.

ال رئيسي الدالة تتعامل مع النتيجة بامتداد مباراة بيان يطبع نصًا بناءً على نتيجة العملية.

Reqwest يستخدم البرمجة غير المتزامنة لعمليات HTTP

تستخدم العديد من الصناديق الشائعة ، بما في ذلك Reqwest ، Tokio لتوفير عمليات HTTP غير متزامنة.

يمكنك استخدام Tokio مع Reqwest لإجراء عدة طلبات HTTP دون حظر المهام الأخرى. يمكن لـ Tokio مساعدتك في التعامل مع آلاف الاتصالات المتزامنة وإدارة الموارد بكفاءة.