تكرار السؤال: …
الإجابة المختصرة
الـ coroutine وصف لعمل غير متزامن لا يعمل حتى يُنتظر أو يُجدول، والـ Task يغلّف coroutine ويجدولها للتنفيذ المتزامن على الـ loop، والـ Future كائن منخفض المستوى يمثل نتيجة ستكتمل لاحقًا (و Task نوع فرعي منه).
الشرح
await coro() ينفذ الـ coroutine متسلسلًا، بينما asyncio.create_task(coro()) يبدأ تشغيلها في الخلفية فورًا. احتفظ بمرجع للـ Task؛ فالـ loop يحتفظ بمرجع ضعيف فقط وقد تُجمع المهمة بواسطة الـ garbage collector قبل اكتمالها، كما أن الاستثناءات في مهام لم ينتظرها أحد تضيع. أفضل طريقة لإدارة دورة حياة المهام هي TaskGroup.
مثال بالكود
import asyncio
background_tasks: set[asyncio.Task] = set()
def fire_and_forget(coro) -> None:
task = asyncio.create_task(coro)
background_tasks.add(task) # يمنع جمع المهمة مبكرًا
task.add_done_callback(background_tasks.discard)أخطاء شائعة
- استدعاء create_task دون حفظ المرجع فتختفي المهمة أو أخطاؤها.
- انتظار المهام واحدة تلو الأخرى فور إنشائها مما يلغي التزامن.