libuv لـ C++: دليل شامل للإدخال والإخراج غير المتزامن
مرحبًا بك في الدليل الشامل لمكتبة libuv للغة C++. هذه المقالة مخصصة لمنصة PythonLib التعليمية، وهي موجهة للمطورين الذين يرغبون في إتقان البرمجة غير المتزامنة في C++ باستخدام واحدة من أكثر المكتبات موثوقية وأداءً.
1. ما هي libuv ولماذا تحتاجها؟
libuv هي مكتبة متعددة المنصات مكتوبة بلغة C، مصممة للإدخال والإخراج غير المتزامن (Async I/O). تم تطويرها في الأصل لمشروع Node.js لتجريد العمل مع دورة الأحداث (Event Loop) وعمليات الإدخال والإخراج غير المحظورة عبر أنظمة التشغيل المختلفة. اليوم، تُستخدم libuv ليس فقط في Node.js، ولكن أيضًا في مشاريع مثل Julia و Luvit و Pyuv (Python) وغيرها الكثير.
لماذا تحتاجها؟ في البرمجة الحديثة، غالبًا ما تحتاج إلى تنفيذ عدة مهام في وقت واحد دون حظر تدفق التنفيذ الرئيسي. الطرق التقليدية مثل تعدد الخيوط (Multithreading) معقدة في التنفيذ وعرضة للأخطاء (سباق البيانات، الجمود). تقدم libuv بديلاً أنيقًا: نموذج غير متزامن يعتمد على دورة الأحداث. تقوم بتسجيل معالجات (Callbacks) لأحداث مختلفة (القراءة من مأخذ توصيل، مؤقت، إشارة)، وتقوم libuv باستدعائها تلقائيًا عند حدوث الحدث، دون حظر تنفيذ المهام الأخرى.
لمطوري C++، توفر libuv أداة قوية لبناء خوادم شبكة عالية الأداء، وعملاء، وأدوات للتعامل مع الملفات، وأدوات مساعدة للنظام. فهي تتولى جميع الأعمال منخفضة المستوى مع epoll (لينكس)، kqueue (ماك)، IOCP (ويندوز) وآليات أخرى، وتوفر واجهة برمجة تطبيقات (API) موحدة وبسيطة. هذا يسمح لك بكتابة كود يعمل على أي منصة دون تعديل.
2. تثبيت libuv
يعتمد تثبيت libuv على نظام التشغيل الخاص بك ومدير الحزم المستخدم. نظرًا لأن libuv هي مكتبة C، فهي لا تُثبت عبر pip أو npm أو cargo. إليك الطرق الرئيسية للتثبيت:
لينكس (Ubuntu/Debian)
sudo apt update
sudo apt install libuv1-dev
ماك (Homebrew)
brew install libuv
ويندوز (vcpkg)
vcpkg install libuv
البناء من المصدر (لجميع المنصات)
git clone https://github.com/libuv/libuv.git
cd libuv
mkdir build && cd build
cmake .. -DBUILD_TESTING=OFF
make -j$(nproc)
sudo make install
بعد التثبيت، يمكنك تجميع برنامجك عن طريق ربط المكتبة:
g++ -std=c++11 -o my_program my_program.cpp -luv
3. البداية السريعة: مثال عملي بسيط
لنكتب برنامجًا بسيطًا ينشئ دورة أحداث ويشغل مؤقتًا يعمل مرة واحدة بعد ثانية واحدة.
#include <uv.h>
#include <cstdio>
// دالة الاستدعاء للمؤقت
void on_timer(uv_timer_t* handle) {
printf("تم تشغيل المؤقت!\n");
// إيقاف دورة الأحداث
uv_stop(handle->loop);
}
int main() {
// 1. إنشاء دورة الأحداث
uv_loop_t* loop = uv_default_loop();
// 2. إنشاء وتهيئة المؤقت
uv_timer_t timer;
uv_timer_init(loop, &timer);
// 3. تشغيل المؤقت: سيعمل مرة واحدة بعد 1000 مللي ثانية
uv_timer_start(&timer, on_timer, 1000, 0);
// 4. تشغيل دورة الأحداث
printf("بدء دورة الأحداث...\n");
uv_run(loop, UV_RUN_DEFAULT);
// 5. تنظيف الموارد
uv_loop_close(loop);
return 0;
}
الشرح:
uv_default_loop()— يحصل على دورة الأحداث الافتراضية العامة.uv_timer_init()— يقوم بتهيئة هيكل المؤقت.uv_timer_start()— يبدأ المؤقت ليعمل بعد 1000 مللي ثانية (الوسيط الثالث) ولا يتكرر (الوسيط الرابع = 0).uv_run()— يبدأ دورة الأحداث في وضعUV_RUN_DEFAULT، مما يعني أنها ستستمر حتى تتوقف.uv_stop()— توقف دورة الأحداث من داخل دالة الاستدعاء.uv_loop_close()— تنظف الموارد المرتبطة بدورة الأحداث.