8.16. الخلاصة

لقد اطّلعت على واجهة برمجة تطبيقات asyncio -- وهي الأجزاء التي يحتاجها البرنامج النصي لتشغيل عدة مهام بالتزامن على وحدة معالجة مركزية واحدة:

  • الجدولة التعاونية -- النموذج الذي ترتكز عليه بقية الوحدة. يحتفظ الإجراء المتزامن الجاري تشغيله بالحلقة لنفسه حتى ينفّذ await؛ ولا تحدث عمليات التبديل إلا عند تلك العمليات من الانتظار.

  • الإجراءات المتزامنة والمهام -- تعرّف async def وحدة عمل؛ ويجدول asyncio.create_task() واحدةً بالتزامن ويُرجع Task يستطيع التطبيق لاحقًا الانتظار عليها أو إلغاءها أو تحديدها.

  • حلقة الأحداث -- المحرك الذي يشغّل الإجراءات المتزامنة والمهام. وتُعد asyncio.run() نقطة الدخول الوحيدة التي تحتاجها معظم البرامج النصية؛ بينما يكشف الصنف Loop عن البقية للحالات النادرة التي تحتاج إليها.

  • التنسيق -- gather() للتوزيع والتجميع، وwait_for() للمواعيد النهائية، وTask.cancel ونمط التنظيف بعبارة finally، وانتشار الاستثناءات عبر المهام واستدعاءات gather، وخطّاف معالج الاستثناءات الخاص بالحلقة.

  • بدائيات المزامنة -- Event للإشارة بين الإجراءات المتزامنة، وLock لتسلسل الوصول إلى مورد مشترك عبر عمليات الانتظار، وThreadSafeFlag لإيقاظ مهمة asyncio من معالج مقاطعة.

  • الكائنات غير المتزامنة المخصصة -- خطّافات اللغة التي تتيح لأصناف التطبيق الاندماج في أنماط asyncio. __await__ للكائنات التي تكون هي نفسها هدف await، و__aiter__ / __anext__ لـ async for، و__aenter__ / __aexit__ لـ async with.

  • التقاط الإطارات -- الغلاف الذي يحوّل csi.CSI.snapshot() إلى إجراء متزامن متوافق مع await، بحيث تعمل حلقة الالتقاط جنبًا إلى جنب مع بقية أعمال asyncio.

  • المزالق -- عبارات await المنسية، والحلقات الضيقة دون تنازلات، وإلغاءات تُبتلع دون معالجة، وحالة مشتركة تُعدَّل عبر عمليات الانتظار، وبقية الفخاخ الخاصة بـ asyncio.

هذا يكفي لكتابة برامج تمزج بين أعمال الكاميرا، ودخل/خرج العتاد، والأعمال الخلفية المتزامنة على الحلقة نفسها.

8.16.1. استخدام هذا المرجع لاحقًا

تعامل مع فصول asyncio بوصفها مادة مرجعية؛ فالعودة إليها لمعرفة شكل async with أو السلوك الدقيق لـ gather() عند فشل أحد الأطراف الشقيقة هو الاستخدام المقصود. وتُدرج صفحة مرجع asyncio كل دالة وصنف في مكان واحد عندما يكون السؤال مجرد "ما الاسم الدقيق لهذا الاستدعاء".

وللاطلاع على بدائيات أكثر ثراءً مبنية فوق الوحدة -- إشارات السيمافور، والطوابير، والحواجز، ومجموعة كبيرة من المساعدات ذات الشكل التطبيقي -- يُعد مستودع peterhinch/micropython-async المصدر القياسي الذي يصونه المجتمع.

8.16.2. إلى أين نتجه من هنا

الشبكات هي الموضوع الرئيس التالي. وتُعد asyncio.open_connection() وasyncio.start_server() والصنف Stream الطريقة التي يتحدث بها برنامج asyncio النصي إلى بقية الشبكة من داخل إجراء متزامن، إلى جانب الوحدتين network وsocket اللتين تقعان تحته. وكل ما تعلمته عن await وTask والإلغاء وبدائيات المزامنة ينتقل مباشرةً إلى هذا الموضوع.