الحوسبة المتوازية

البرمجة اللّامتزامنة ( asynchronous programming )

نبذة عن البرمجة اللّامتزامنة باستخدام مكتبة Asyncio

البرمجة اللّامتزامنة ( asynchronous programming ) تعتبر من أقوى وأحدث أساليب المعالجة المتوازية ، كونها قابلة للجمع بين مسارات التنفيذ-الخيوط ( threads ) ، و تعدد المُعالِجات multi-processing ، ومع كل هذا فالبرمجة غير المتزامنة لديها منطق خاص وفريد . لنتعرف على المزيد ..

هذا المقال تتمة لمقال طويل عن راجع مقالنا عن التوالي والتوازي

ما هو منطق اللّاتزامن

اللّاتزامن أو الّلاتواقت (Asynchrony) هو مبدأ ترتيب المهام وتنفيذها وِفق ترتيب وأولويات تحددها أنت كمبرمج ، دون الخضوع للترتيب الذي يفرضه السياق ، هذا يُمكّنك إمن طلاق مسارات تنفيذ جديدة وجعلها تنتظر بعضها البعض وتتبادل المعلومات فيما بينها .

إذن ما هي البرمجة اللّامتزامنة ؟

حسناً ، كما رأينا في مقال سابق عن التسلسل والتوازي ، فالبرمجة التسلسلية ( serial programming ) هي تنفيذ الكود سطرا تلو الآخر بالتوالي . هذا هو الأسلوب التقليدي ويسمى أسلوب البرمجة المتزامنة ( synchronous programming ) ، أسلوب بسيط ومفهوم .. لكن ماذا لو أردنا عمل سكريبت لطلب الـ requests من 3 خوادم (servers) مختلفة . أحيانا طلب الـ request الواحد قد يأخذ وقتا أطول من اللّازم ، تخيل أن الطلب من الخادم الثاني سيأخذ 20 ثانية ! في هذه اللحظة السكريبت كله لا يفعل أي شيء سوى انتظار الرد (response) من هذا الخادم ، ولن ينتقل السكريبت إلى طلب الريكويست من السيرفر التالي حتى يصل الرد على الطلب الحالي .
ماذا لو كان باستطاعتنا عمل سكريبت يقوم بإرسال الطلب للسيرفر التالي بينما ينتظر الرد من السيرفر السابق ، هذه هي البرمجة اللّامتزامنة وفكرتها الأساسية هي استثمار وقت إنتظار المهمة الحالية في تنفيذ المهام التي تليها ، وهذا مبدأ أصيل في علم إدارة الوقت والمهام .

البرمجة الغير متزامنة في بايثون

مكتبة asyncio

في المثال التالي تطبيق بسيط لطلب 3 مواقع وطباعة الرد :

import aiohttp
import asyncio
import async_timeout

async def fetch(session, url):
async with session.get(url) as response:
return response.status

async def main(loop ,url):
print ("send request to:", url)
async with aiohttp.ClientSession(loop=loop) as session:
req = await fetch(session, url)
print ("get response from:", url, "---> status code:" ,req)

urls = ["http://pythonation.com",
"http://python.org",
"http://www.kaggle.com",
]

loop = asyncio.get_event_loop()
gatherer = asyncio.gather( *(main(loop, url) for url in urls) )

loop.run_until_complete(gatherer)
  • التعبير async في بداية الدالة يستخدم لتعريف الدالة على أنها دالة غير متزامنة ، ويطلق عليها برمجيا الروتين المساعد (coroutine) .
    • يستخدم التعبير async أيضا داخل الدوال لتعريف المولدات asynchronous generator .
الكود السابق تم تطبيقه على بايثون 3.6 ، لا يعمل مع النسخة 2.7 .
  • التعبير await يستخدم لانتظار تنفيذ الـروتين المساعد ثم ارجاع القيمة منه والاستمرار ، في مثالنا (السطر 12) انتظرنا ارجاع القيمة من الدالة fetch .
  • في السطر (20) حلقة الحدث (event_loop) هي المنفذ الأساسي والمتحكم في جميع عمليات اللّأتزامن في الكود . وصلنا إليها عبر الأمر asyncio.get_event_loop .
  • في السطر (21) الامر asyncio.gather لتجميع المخرجات من الـ corotines ، في مثالنا إستخدمناه لإلتقاط المخرجات من حلقة التكرار المسؤولة عن تطبيق الدالة main على عناصر القائمة urls .
  • أخير الأمر run_until_complete يستخدم لبدء حلقة الحدث event loop ، يمكن اعتباره هو زر التشغيل للعمليات اللّامتزامنة .
async بايثون شرح
البرمجة اللّامتزامنة

الفرق بين البرمجة المتزامنة والبرمجة الغير متزامنة في مسار التنفيذ :

البرمجة المتزامنة :

شرح البرمجة المتزامنة synctonous

البرمجة غير المتزامنة :

شرح البرمجة غير المتزامنة asyncrounos
شرح البرمجة غير المتزامنة asyncrounos

الفرق بين البرمجة المتزامنة والبرمجة الغير متزامنة من حيث سرعة التنفيذ :

 

طلبات غير متزامنة مع بايثون و async
طلبات غير متزامنة مع بايثون و async

في هذا المقال :

تكلمنا عن تقنية البرمجة الغير متزامنة ( async programming ) ، و وضعنا مثال لها بلغة بايثون ، ثم قمنا بعمل مقارنة بينها وبين البرمجة المتزامنة من حيث السرعة والأداء .

فهرس المقالة

[hm_content_toc title=”” headers=”h2"]

رخصة المحتوى

الوسوم

محمد هشوم

مبرمج عربي ، مهتم بالذكاء الصنعي وخبير بيانات .. ومدون !

‫4 تعليقات

  1. ابداااع استمر في نشر الموضوعات المشابهة في البرمجة لأنها مهمة وقد وضعت موضوعاتك في المفضلة

  2. “” ومع كل هذا فالبرمجة الغير متزامنة لديها منطق خاص وفريد . لنتعرف على المزيد””
    وجبت الإشارة إلى خطأ لغوي : غير المتزامنة و ليس الغير متزامنة
    ملحوظة : هو خطأ شائع جدا

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى
إغلاق
إغلاق