الكوروتينات وحلقة الأحداث
عرّف الكوروتينات باستخدام async def وشغّلها باستخدام asyncio.run()
الكوروتينات وحلقة الأحداث درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
ما هو التزامن؟
يوفّر Asyncio التزامن التعاوني: إذ يتولى خيط واحد معالجة مهام متعددة عبر التبديل بينها كلما كانت إحداها تنتظر إدخالًا وإخراجًا.
# Traditional: blocking I/O holds the whole thread
# Asyncio: while waiting for I/O, run other coroutines
import asyncio
async def main():
print("Hello")
await asyncio.sleep(1) # yield control
print("World")
asyncio.run(main())async def — دوال coroutine
الدوال المعرّفة باستخدام async def هي دوال coroutine. ويُعيد استدعاؤها كائن coroutine؛ ولا تُنفَّذ إلا عند انتظارها أو جدولتها.
import asyncio
async def greet(name):
return f"Hello, {name}"
result = asyncio.run(greet("Alice"))
print(result) # Hello, Aliceحلقة الأحداث
تدير حلقة الأحداث تنفيذ coroutines. ينشئ asyncio.run(coro) حلقة أحداث جديدة، ويشغّل coroutine حتى اكتمالها، ثم يغلق الحلقة.
import asyncio
async def compute():
await asyncio.sleep(0)
return 42
value = asyncio.run(compute())
print(value) # 42
# For advanced use:
loop = asyncio.new_event_loop()
result = loop.run_until_complete(compute())
loop.close()يوقف await التنفيذ مؤقتًا
يعلّق await expr عمل coroutine الحالية حتى يكتمل expr، سواء أكان coroutine أخرى أم future. وفي أثناء ذلك، تشغّل حلقة الأحداث مهام أخرى.
import asyncio
async def task(name, delay):
print(f"{name} starting")
await asyncio.sleep(delay)
print(f"{name} done")
async def main():
await task("A", 2)
await task("B", 1) # sequential here
asyncio.run(main())asyncio.sleep()
يعلّق asyncio.sleep(seconds) عمل coroutine الحالية للمدة المحددة دون حظر حلقة الأحداث.
import asyncio
async def heartbeat():
while True:
print("ping")
await asyncio.sleep(1)
# asyncio.run(heartbeat()) # runs foreverنقطة دخول asyncio.run()
يُعد asyncio.run(coro) نقطة الدخول القياسية في المستوى الأعلى. لا تستدعِه مطلقًا من داخل حلقة أحداث قيد التشغيل.
import asyncio
async def main():
print("running")
if __name__ == "__main__":
asyncio.run(main())التحقق من وجودك داخل حلقة أحداث
استخدم asyncio.get_running_loop() لاكتشاف ما إذا كانت هناك حلقة قيد التشغيل بالفعل؛ إذ يرفع RuntimeError إذا لم تكن موجودة.
import asyncio
async def inner():
loop = asyncio.get_running_loop()
print(f"Loop: {loop}")
asyncio.run(inner())تشغيل التعليمات البرمجية الحاجزة
شغّل التعليمات البرمجية كثيفة استخدام المعالج أو عمليات الإدخال والإخراج الحاجزة دون حظر حلقة الأحداث باستخدام loop.run_in_executor(None, func, *args).
import asyncio, time
def blocking():
time.sleep(2)
return "done"
async def main():
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None, blocking)
print(result)
asyncio.run(main())تسلسل coroutines
يمكن لـ coroutines أن تستخدم await مع coroutines أخرى، مما ينشئ سلسلة. يتدفق التحكم إلى أسفل السلسلة ثم يعود إلى أعلى مع اكتمال كل مستوى.
import asyncio
async def fetch_data():
await asyncio.sleep(1)
return {"value": 42}
async def process():
data = await fetch_data()
return data["value"] * 2
async def main():
result = await process()
print(result) # 84
asyncio.run(main())التعرّف على coroutines
استخدم asyncio.iscoroutine(obj) أو asyncio.iscoroutinefunction(func) لفحص الدوال غير المتزامنة أثناء التشغيل.
import asyncio
async def my_coro():
pass
print(asyncio.iscoroutinefunction(my_coro)) # True
coro = my_coro()
print(asyncio.iscoroutine(coro)) # True
coro.close() # clean up the un-awaited coroutineوضع تصحيح أخطاء asyncio
فعّل وضع تصحيح الأخطاء لاكتشاف coroutines التي لم يُنتظر إكمالها، وعمليات رد الاتصال البطيئة، والمشكلات الأخرى: اضبط PYTHONASYNCIODEBUG=1 أو مرّر debug=True إلى asyncio.run.
import asyncio
async def main():
pass
asyncio.run(main(), debug=True)
# Or:
# PYTHONASYNCIODEBUG=1 python script.pyتحقق سريع
ماذا يفعل asyncio.run(coro)؟
مراجعة
عرّف coroutines باستخدام async def، وشغّلها باستخدام asyncio.run()، وعلّقها باستخدام await. وتجدول حلقة الأحداث coroutines تعاونيًا، فتشغّل مهام أخرى أثناء انتظار إحداها لعمليات الإدخال والإخراج.
الأسئلة الشائعة
هل درس «الكوروتينات وحلقة الأحداث» مجاني؟
نعم — نص درس «الكوروتينات وحلقة الأحداث» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «الكوروتينات وحلقة الأحداث»؟
عرّف الكوروتينات باستخدام async def وشغّلها باستخدام asyncio.run() تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الكوروتينات وحلقة الأحداث»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الكوروتينات وحلقة الأحداث
- await والمهام والتجميع
- مديرو السياق والمكرّرات غير المتزامنين
- أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج