await والمهام والتجميع
استخدم await وasyncio.create_task وasyncio.gather للتزامن
await والمهام والتجميع درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
await مقارنةً بالتنفيذ التسلسلي
يؤدي استخدام await وحده إلى تشغيل coroutines بالتتابع. ولتشغيلها بالتزامن، غلّفها داخل Tasks.
import asyncio
async def main():
# Sequential — total ~3 s
await asyncio.sleep(2)
await asyncio.sleep(1)
# Concurrent using gather — total ~2 s
await asyncio.gather(asyncio.sleep(2), asyncio.sleep(1))asyncio.create_task()
تجدول asyncio.create_task(coro) coroutine لتعمل كمهمة مستقلة بالتزامن مع coroutine الحالية.
import asyncio
async def work(n):
await asyncio.sleep(n)
return n
async def main():
t1 = asyncio.create_task(work(2))
t2 = asyncio.create_task(work(1))
r1 = await t1
r2 = await t2
print(r1, r2) # 2 1 (total ~2 s)
asyncio.run(main())asyncio.gather()
يشغّل asyncio.gather(*coros) coroutines بالتزامن، ويُعيد جميع النتائج بالترتيب عند اكتمالها كلها.
import asyncio
async def fetch(i):
await asyncio.sleep(1)
return f"data-{i}"
async def main():
results = await asyncio.gather(fetch(1), fetch(2), fetch(3))
print(results) # ["data-1", "data-2", "data-3"] in ~1 s
asyncio.run(main())gather مع return_exceptions
اضبط return_exceptions=True لكي تُعيد coroutine الفاشلة استثناءها كنتيجة بدلًا من إلغاء عملية gather بأكملها.
import asyncio
async def risky(n):
if n == 2: raise ValueError("bad")
return n
async def main():
results = await asyncio.gather(
risky(1), risky(2), risky(3),
return_exceptions=True
)
print(results) # [1, ValueError("bad"), 3]asyncio.wait()
تعيد asyncio.wait(tasks, return_when=...) مجموعتين: done وpending. استخدم FIRST_COMPLETED للاستجابة للنتيجة الأولى.
import asyncio
async def slow(): await asyncio.sleep(3); return "slow"
async def fast(): await asyncio.sleep(1); return "fast"
async def main():
tasks = {asyncio.create_task(slow()), asyncio.create_task(fast())}
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
for t in pending: t.cancel()إلغاء المهام
استدعِ task.cancel() لطلب الإلغاء. تتلقى المهمة الاستثناء asyncio.CancelledError عند وصولها إلى نقطة await التالية.
import asyncio
async def long_job():
try:
await asyncio.sleep(100)
except asyncio.CancelledError:
print("Cancelled!")
raise # re-raise is required
async def main():
t = asyncio.create_task(long_job())
await asyncio.sleep(1)
t.cancel()
await tasyncio.timeout() — Python 3.11+
استخدم asyncio.timeout(seconds) لتغليف عملية انتظار، بحيث تُلغى العملية إذا استغرقت وقتًا أطول من اللازم.
import asyncio
async def main():
try:
async with asyncio.timeout(2):
await asyncio.sleep(10) # too slow
except TimeoutError:
print("Timed out!")asyncio.wait_for()
في إصدارات Python الأقدم من 3.11، استخدم asyncio.wait_for(coro, timeout=N) لإضافة مهلة زمنية، ما يؤدي إلى رفع asyncio.TimeoutError.
import asyncio
async def slow(): await asyncio.sleep(5)
async def main():
try:
await asyncio.wait_for(slow(), timeout=2)
except asyncio.TimeoutError:
print("Timed out")أسماء المهام وفحصها
امنح المهام أسماءً لتسهيل تصحيح الأخطاء باستخدام asyncio.create_task(coro, name="...")، وافحصها باستخدام task.get_name().
import asyncio
async def worker(): await asyncio.sleep(1)
async def main():
t = asyncio.create_task(worker(), name="worker-1")
print(t.get_name()) # worker-1
await tTaskGroup — Python 3.11+
تنشئ asyncio.TaskGroup مجموعةً منظمةً من المهام. إذا رفعت أي مهمة استثناءً، تُلغى جميع المهام.
import asyncio
async def main():
async with asyncio.TaskGroup() as tg:
t1 = tg.create_task(asyncio.sleep(1))
t2 = tg.create_task(asyncio.sleep(2))
# all tasks done hereSemaphore لتحديد معدل التنفيذ
استخدم asyncio.Semaphore(n) للحد من عدد العمليات المتزامنة، مثل استدعاءات API.
import asyncio
sem = asyncio.Semaphore(5) # max 5 concurrent
async def limited_fetch(url):
async with sem:
await fetch(url) # at most 5 at a timeتحقق سريع
ما الفرق بين await coro() وasyncio.create_task(coro())؟
مراجعة
استخدم create_task أو gather لتنفيذ العمليات بالتزامن. تجمع gather جميع النتائج، بينما تمنحك wait تحكمًا دقيقًا. ألغِ المهام باستخدام .cancel()، وطبّق المهلات الزمنية باستخدام wait_for أو asyncio.timeout.
الأسئلة الشائعة
هل درس «await والمهام والتجميع» مجاني؟
نعم — نص درس «await والمهام والتجميع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «await والمهام والتجميع»؟
استخدم await وasyncio.create_task وasyncio.gather للتزامن تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «await والمهام والتجميع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الكوروتينات وحلقة الأحداث
- await والمهام والتجميع
- مديرو السياق والمكرّرات غير المتزامنين
- أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج