ما هي البرمجة غير المتزامنة ولماذا تحتاجها
البرمجة غير المتزامنة تتيح لك تنفيذ عدة عمليات في وقت واحد دون الحاجة لانتظار انتهاء كل عملية على حدة. هذا أمر بالغ الأهمية لبناء تطبيقات عالية الأداء لا تتعطل أثناء تنفيذ العمليات البطيئة.
المزايا الرئيسية للبرمجة غير المتزامنة
تكون البرمجة غير المتزامنة فعالة بشكل خاص في السيناريوهات التالية:
- طلبات الشبكة (طلبات HTTP، التعامل مع REST API)
- عمليات نظام الملفات (قراءة وكتابة الملفات الكبيرة)
- التفاعل مع قواعد البيانات (استعلامات SQL، عمليات NoSQL)
- اتصالات WebSocket وتطبيقات الوقت الفعلي
- استخراج بيانات المواقع الإلكترونية (Web Scraping)
- معالجة قوائم انتظار الرسائل
مقدمة إلى مكتبة asyncio
asyncio هي مكتبة Python القياسية لكتابة الكود غير المتزامن، والتي تعتمد على حلقة الأحداث (event loop). تم تضمين المكتبة في Python بدءًا من الإصدار 3.4 وتم تحسينها بشكل كبير في الإصدارات 3.7+.
الإمكانيات الرئيسية لـ asyncio
باستخدام asyncio يمكنك:
- إنشاء وإدارة الكوروتينات (coroutines)
- تشغيل مهام غير متزامنة متعددة بالتوازي
- معالجة آلاف الاتصالات المتزامنة بكفاءة
- التكامل مع المكتبات والأطر غير المتزامنة
المفاهيم الأساسية في asyncio
الكوروتينات (Coroutines)
الكوروتين هو دالة خاصة يمكن إيقافها مؤقتًا ثم استئنافها لاحقًا. في Python، يتم تعريف الكوروتينات باستخدام الكلمة المفتاحية async def.
import asyncio
async def greet():
print("مرحبًا!")
await asyncio.sleep(1)
print("مرت ثانية واحدة.")
# تشغيل الكوروتين
asyncio.run(greet())
الكلمة المفتاحية await
تُستخدم await لإيقاف تنفيذ الكوروتين مؤقتًا حتى تكتمل عملية غير متزامنة أخرى. هذه هي الآلية الأساسية لإعادة التحكم إلى حلقة الأحداث (event loop).
async def delayed_message():
print("بدء التنفيذ")
await asyncio.sleep(2)
print("رسالة بعد ثانيتين")
asyncio.run(delayed_message())
حلقة الأحداث (Event Loop)
حلقة الأحداث هي قلب asyncio، وهي الآلية التي تدير تنفيذ جميع المهام غير المتزامنة. بدءًا من Python 3.7، يُوصى باستخدام asyncio.run() لتشغيل الكود غير المتزامن.
# الطريقة الحديثة (Python 3.7+)
asyncio.run(main_coroutine())
# الطريقة القديمة (قبل Python 3.7)
loop = asyncio.get_event_loop()
loop.run_until_complete(main_coroutine())
إنشاء وإدارة المهام غير المتزامنة
تنفيذ المهام بالتوازي
يكشف الكود غير المتزامن عن قوته الحقيقية عند تنفيذ عدة مهام بالتوازي:
async def task(name, delay):
print(f"المهمة {name} بدأت")
await asyncio.sleep(delay)
print(f"المهمة {name} اكتملت بعد {delay} ثوانٍ")
return f"نتيجة من {name}"
async def main():
# الطريقة 1: asyncio.gather()
results = await asyncio.gather(
task("أ", 2),
task("ب", 1),
task("ج", 3)
)
print("جميع النتائج:", results)
asyncio.run(main())
إنشاء المهام باستخدام asyncio.create_task()
للحصول على تحكم أفضل في التنفيذ، استخدم asyncio.create_task():
async def main():
# إنشاء المهام
task_a = asyncio.create_task(task("أ", 2))
task_b = asyncio.create_task(task("ب", 1))
task_c = asyncio.create_task(task("ج", 3))
# انتظار اكتمالها
await task_a
await task_b
await task_c
asyncio.run(main())