Tokio هو وقت تشغيل (runtime) غير متزامن للغة البرمجة Rust. يوفر اللبنات الأساسية اللازمة لكتابة تطبيقات الشبكات (networking applications). يمنح المرونة لاستهداف مجموعة واسعة من الأنظمة، من الخوادم الكبيرة التي تحتوي على عشرات النوى إلى الأجهزة المدمجة الصغيرة (embedded devices).
على مستوى عالٍ، يوفر Tokio بعض المكونات الرئيسية:
- وقت تشغيل متعدد الخيوط (multi-threaded runtime) لتنفيذ الكود غير المتزامن (asynchronous code).
- إصدار غير متزامن من المكتبة القياسية (standard library).
- نظام بيئي كبير من المكتبات (ecosystem of libraries).
دور Tokio في مشروعك
عندما تكتب تطبيقك بطريقة غير متزامنة (asynchronous manner)، فإنك تمكنه من التوسع بشكل أفضل بكثير عن طريق تقليل تكلفة القيام بالعديد من الأشياء في نفس الوقت. ومع ذلك، فإن كود Rust غير المتزامن لا يعمل بمفرده، لذلك يجب عليك اختيار وقت تشغيل (runtime) لتنفيذه. مكتبة Tokio هي وقت التشغيل الأكثر استخدامًا، متجاوزة جميع أوقات التشغيل الأخرى مجتمعة.
بالإضافة إلى ذلك، يوفر Tokio العديد من الأدوات المساعدة المفيدة. عند كتابة كود غير متزامن، لا يمكنك استخدام واجهات برمجة التطبيقات (APIs) العادية التي توفرها المكتبة القياسية لـ Rust، ويجب عليك بدلاً من ذلك استخدام إصدارات غير متزامنة منها. يتم توفير هذه الإصدارات البديلة بواسطة Tokio، مما يعكس API المكتبة القياسية لـ Rust حيثما يكون ذلك منطقيًا.
مزايا Tokio
سيحدد هذا القسم بعض مزايا Tokio.
سريع (Fast)
Tokio سريع، مبني على لغة البرمجة Rust، وهي بحد ذاتها سريعة. يتم ذلك بروح Rust بهدف ألا تتمكن من تحسين الأداء عن طريق كتابة كود مكافئ يدويًا.
Tokio قابل للتطوير (scalable)، مبني على ميزة اللغة async/await، وهي بحد ذاتها قابلة للتطوير. عند التعامل مع الشبكات، هناك حد لمدى سرعة معالجة الاتصال بسبب زمن الوصول (latency)، لذا فإن الطريقة الوحيدة للتوسع هي التعامل مع العديد من الاتصالات في وقت واحد. مع ميزة اللغة async/await، يصبح زيادة عدد العمليات المتزامنة (concurrent operations) رخيصًا بشكل لا يصدق، مما يسمح لك بالتوسع إلى عدد كبير من المهام المتزامنة (concurrent tasks).
موثوق (Reliable)
تم بناء Tokio باستخدام Rust، وهي لغة تمكن الجميع من بناء برامج موثوقة وفعالة. لقد وجدت عدد من الدراسات أن حوالي 70% من الأخطاء الأمنية عالية الخطورة (high severity security bugs) هي نتيجة لعدم أمان الذاكرة (memory unsafety). استخدام Rust يلغي هذه الفئة بأكملها من الأخطاء في تطبيقاتك.
يركز Tokio أيضًا بشكل كبير على توفير سلوك متسق بدون مفاجآت. الهدف الرئيسي لـ Tokio هو السماح للمستخدمين بنشر برامج يمكن التنبؤ بها والتي ستعمل بنفس الطريقة يومًا بعد يوم مع أوقات استجابة موثوقة وعدم وجود ارتفاعات غير متوقعة في زمن الوصول (unpredictable latency spikes).
سهل (Easy)
مع ميزة async/await في Rust، تم تخفيض تعقيد كتابة التطبيقات غير المتزامنة بشكل كبير. مقترنًا بأدوات Tokio ونظامها البيئي النابض بالحياة، أصبحت كتابة التطبيقات أمرًا سهلاً.
يتبع Tokio اصطلاح تسمية المكتبة القياسية (standard library’s naming convention) عندما يكون ذلك منطقيًا. يتيح ذلك تحويل الكود المكتوب باستخدام المكتبة القياسية فقط بسهولة إلى كود مكتوب باستخدام Tokio. مع نظام الأنواع القوي (strong type system) في Rust، فإن القدرة على تقديم كود صحيح بسهولة لا مثيل لها.
مرن (Flexible)
يوفر Tokio إصدارات متعددة من وقت التشغيل (runtime). كل شيء بدءًا من وقت تشغيل متعدد الخيوط (multi-threaded)، [سرقة العمل (work-stealing)] إلى وقت تشغيل خفيف الوزن (light-weight)، أحادي الخيط (single-threaded). يأتي كل من أوقات التشغيل هذه مع العديد من الإعدادات (knobs) للسماح للمستخدمين بضبطها لتلبية احتياجاتهم.
متى لا تستخدم Tokio
على الرغم من أن Tokio مفيد للعديد من المشاريع التي تحتاج إلى القيام بالكثير من الأشياء في وقت واحد، إلا أن هناك أيضًا بعض حالات الاستخدام التي لا يكون فيها Tokio مناسبًا.
- تسريع العمليات الحسابية المعتمدة على وحدة المعالجة المركزية (CPU-bound computations) عن طريق تشغيلها بالتوازي على عدة خيوط (threads). تم تصميم Tokio لتطبيقات IO-bound حيث تقضي كل مهمة فردية معظم وقتها في انتظار IO. إذا كان الشيء الوحيد الذي يفعله تطبيقك هو تشغيل العمليات الحسابية بالتوازي، فيجب عليك استخدام rayon. ومع ذلك، لا يزال من الممكن "الخلط والمطابقة" (mix & match) إذا كنت بحاجة إلى القيام بالأمرين معًا. انظر منشور المدونة هذا للحصول على مثال عملي.
- قراءة الكثير من الملفات. على الرغم من أنه يبدو أن Tokio سيكون مفيدًا للمشاريع التي تحتاج ببساطة إلى قراءة الكثير من الملفات، إلا أن Tokio لا يوفر أي ميزة هنا مقارنة بمجموعة خيوط عادية (ordinary threadpool). هذا لأن أنظمة التشغيل (operating systems) لا توفر بشكل عام واجهات برمجة تطبيقات ملفات غير متزامنة (asynchronous file APIs).
- إرسال طلب ويب واحد (single web request). المكان الذي يمنحك فيه Tokio ميزة هو عندما تحتاج إلى القيام بالعديد من الأشياء في نفس الوقت. إذا كنت بحاجة إلى استخدام مكتبة مخصصة لـ Rust غير المتزامن مثل reqwest، ولكنك لا تحتاج إلى القيام بالكثير من الأشياء في وقت واحد، فيجب أن تفضل الإصدار الحظر (blocking version) لتلك المكتبة، حيث سيجعل مشروعك أبسط. سيظل استخدام Tokio يعمل، بالطبع، ولكنه لا يوفر أي ميزة حقيقية على API الحظر. إذا لم توفر المكتبة API حظرًا، فراجع الفصل الخاص بالربط مع الكود المتزامن (bridging with sync code).
الحصول على المساعدة
في أي وقت، إذا واجهتك مشكلة، يمكنك دائمًا الحصول على المساعدة على Discord أو مناقشات GitHub. لا تقلق بشأن طرح أسئلة "المبتدئين". كلنا نبدأ من مكان ما ويسعدنا تقديم المساعدة.