8. Asyncio

حتى الآن كان كل برنامج نصي في هذا الدرس تسلسليًا -- يُنفَّذ سطر واحد في كل مرة، وأي استدعاء يضطر للانتظار (قراءة مستشعر، أو ذهاب وإياب عبر الشبكة، أو لقطة) يحجب البرنامج النصي حتى ينتهي. وهذا يعمل ما دام هناك شيء واحد فقط لفعله. لكن في اللحظة التي يحتاج فيها التطبيق إلى فعل عدة أشياء في آنٍ واحد -- تشغيل حلقة لقطات و الرد على أمر تسلسلي، و رفع إطارات عبر الشبكة -- ينهار البرنامج النصي التسلسلي. إذ يوقف أول استدعاء بطيء كل شيء آخر عن إحراز تقدّم.

وحدة asyncio هي إجابة MicroPython. فهي تتيح للتطبيق وصف عدة مهام كـ كوروتينات منفصلة وتشغيلها بالتزامن على خيط واحد، بالتعاون -- إذ تتنازل أيًا كانت الكوروتين قيد التشغيل حاليًا عن التحكم للمجدول كلما اضطرت للانتظار. ويمكن لحلقة لقطات، وقارئ UART، وعميل شبكة أن تعيش جميعها في البرنامج النصي نفسه دون أن تجمّد الأجزاء البطيئة من أحدها الأجزاء الأخرى.

تغطي الصفحات القادمة الكلمتين المفتاحيتين async/await ودورة حياة Task، والتنسيق عبر gather() و wait_for()، والإلغاء وانتشار الاستثناءات، وبدائيات المزامنة المدمجة الثلاث (Event، و Lock، و ThreadSafeFlag)، وخطافات اللغة لتوصيل أصناف التطبيق بأساليب asyncio، وغلاف CSI صغير يتيح تشغيل snapshot() ككوروتين، والمزالق الشائعة التي تأتي مع الجدولة التعاونية.

التحكم في الحلقة

التقاط الإطارات

المزالق

الخلاصة