عند العمل مع بايثون للتفاعل مع واجهات برمجة التطبيقات على الويب، وخصوصًا عند التعامل مع طلبات متعددة، من المحتمل أنك واجهت بعض التأخيرات. سواء كان ذلك تنزيل الملفات، أو جمع البيانات، أو إجراء طلبات إلى واجهات برمجة التطبيقات، فإن الانتظار حتى تنتهي كل مهمة يمكن أن يبطئ الأمور بشكل كبير. هنا يأتي دور البرمجة غير المتزامنة لإنقاذ الموقف، وأحد أفضل الأدوات في نظام بايثون البيئي لهذا هو مكتبة aiohttp.
إذا كنت غير مألوف بالبرمجة غير المتزامنة، فلا تقلق! سأشرحها بمصطلحات بسيطة وأوضح كيف يمكن لمكتبة aiohttp أن تساعد في تسريع طلبات الويب الخاصة بك، مما يجعلها أسرع وأكثر كفاءة.
قبل أن نتعمق أكثر، دعنا نتحدث عن شيء يتعامل معه كل مطور: اختبار واجهات برمجة التطبيقات. وإذا كنت مثل معظم الفرق، فمن المحتمل أنك تستخدم Postman لهذا.
أفهم ذلك - Postman هي أداة مألوفة. لكن لنكن صادقين، أليس الجميع قد لاحظ كيف أنها أصبحت أقل جاذبية عامًا بعد عام؟ ومع ذلك، هنا أنت، تعمل كفريق، وتحتاج إلى أدوات تعاون للحفاظ على سلاسة عملية التطوير. فما الذي تفعله؟ تستثمر في Postman Enterprise بمبلغ ضخم يبلغ 49 دولارًا في الشهر.
لكن ها هي المفاجأة: لست مضطرًا لذلك.
نعم، لقد قرأت ذلك بشكل صحيح. هناك طريقة أفضل وأكفأ لإدارة اختبار واجهات برمجة التطبيقات وتعاون الفريق دون الحاجة إلى إنفاق الكثير من المال على أداة، بصراحة، لا تقدم ما كانت تقدمه في السابق. دعونا نستكشف بعض البدائل الأفضل!

APIDog: تحصل على كل شيء من النسخة المدفوعة من Postman، ولكن بسعر أرخص
هذا صحيح، توفر لك APIDog جميع الميزات التي تأتي مع النسخة المدفوعة من Postman، بتكلفة جزء بسيط فقط. كان الانتقال سهلاً للغاية حيث تحتاج فقط إلى الضغط على قليل من الأزرار، وسيتولى APIDog كل شيء من أجلك.
تستحق APIDog بالتأكيد التجربة. ولكن إذا كنت قائد التقنية لفريق تطوير يرغب حقًا في التخلي عن Postman من أجل شيء أفضل وأرخص، تحقق من APIDog!
ما هي aiohttp؟
aiohttp هي مكتبة بايثون شائعة تتيح لك كتابة عملاء وخوادم HTTP غير متزامنة. اعتبرها مثل مكتبة requests الخاصة ببايثون ولكن مشحونة بقوة البرمجة غير المتزامنة.
تم بناؤها على قمة إطار العمل asyncio الخاص ببايثون، مما يعني أنه يمكنها التعامل مع عدد كبير من الطلبات في وقت واحد دون انتظار انتهاء كل واحدة قبل الانتقال إلى التالية.
تخيل أنك في مقهى، وبدلاً من الانتظار في صف لكل طلب ليكتمل واحدًا تلو الآخر، يبدأ العديد من النادلين في العمل على طلبك في نفس الوقت.
مع aiohttp، كأنه لديك فريق من النادلين، جميعهم يقومون بصنع القهوة (أو، في هذه الحالة، جلب البيانات) في نفس الوقت. النتيجة؟ نتائج أسرع مع انتظار أقل.
لماذا يجب أن تهتم بـ aiohttp؟
دعنا نتحدث عن لماذا يجب أن تكون aiohttp مهمة بالنسبة لك، سواء كنت مبتدئًا في بايثون، أو عالم بيانات، أو جامع بيانات، أو حتى مطورًا ذو خبرة.
- الأداء: السبب الرئيسي لاستخدام aiohttp هو الأداء. إذا كنت بحاجة إلى إجراء مكالمات API متعددة أو طلبات لموقع ويب، فإن aiohttp يمكنه التعامل معها في وقت واحد.
بدلاً من معالجتها واحدة تلو الأخرى، يمكنك تنفيذ العشرات أو حتى المئات من الطلبات في نفس الوقت. - القابلية للتوسع: يمكن أن يكون جمع البيانات من الويب أو الاتصال بالعديد من واجهات برمجة التطبيقات عملية بطيئة ومتعطلة باستخدام البرمجة المتزامنة. ومع ذلك، مع aiohttp، يمكنك إدارة المزيد من المهام في وقت أقل، مما يعني أن تطبيقك يمكنه التعامل مع زيادة الطلبات أو مجموعات البيانات الأكبر.
- تقليل أوقات الانتظار: البرامج المتزامنة التقليدية يجب أن تنتظر حتى تنتهي مهمة واحدة قبل البدء في التالية.
مع الشفرة غير المتزامنة، لا تحتاج المهام إلى الانتظار. يمكنك تنزيل البيانات من عدة عناوين URL دفعة واحدة، مما يقلل من إجمالي وقت التشغيل بشكل كبير. - استخدام موارد فعّالة: البرمجة غير المتزامنة، وخاصة aiohttp، تجعل استخدام موارد النظام أكثر كفاءة.
بدلاً من إيقاف تشغيل خيط كامل أو عملية في انتظار استجابة، تتيح aiohttp للمهام الأخرى العمل أثناء انتظار إتمام عملية الإدخال/الإخراج.
كيف تعمل aiohttp؟
دعونا نتعمق في كيفية عمل aiohttp في الواقع.
أولًا، دعونا نوضح ما تعنيه البرمجة غير المتزامنة حقًا. في برنامج متزامن، يجب أن تنتهي كل مهمة قبل أن تبدأ الأخرى.
إذا كنت تنتظر استجابة من خادم الويب لطلبك، يتوقف البرنامج بأكمله حتى تصل تلك الاستجابة. تتيح البرمجة غير المتزامنة للبرنامج متابعة تنفيذ المهام الأخرى أثناء انتظار الاستجابة.
تستفيد aiohttp من هذا النموذج غير المتزامن لتتيح لك إطلاق عدة طلبات HTTP في نفس الوقت، ثم التعامل مع الاستجابات حالما تتاح. إليك مثال يوضح ذلك بطريقة بسيطة:
كيفية إجراء طلب ويب باستخدام aiohttp: الأساسيات

توضح هذه الصورة (الشكل 2) تدفق العمليات المتزامنة (مهمة واحدة تكتمل قبل التالية) والتدفق غير المتزامن (عدة مهام تعمل في وقت واحد).
تمثل الصناديق الزرقاء المهام المتزامنة، بينما تمثل الصناديق الخضراء المهام غير المتزامنة.
تشير الأسهم إلى تدفق التنفيذ لكل من العمليات المتزامنة وغير المتزامنة.
ت Visualization حلقة الحدث (آلية الحلقة ضمن نموذج بايثون غير المتزامن)

توتضح هذه الصورة (الشكل 3) آلية حلقة الحدث في نموذج البرمجة غير المتزامنة في بايثون.
تمثل العقد خطوات مختلفة، مثل بدء المهام، الانتظار لعمليات الإدخال/الإخراج، وتنفيذ ردود الاتصال.
تظهر الأسهم الموجهة كيف تُInitiate المهام، وكيف تنتظر عمليات الإدخال/الإخراج، وكيف تتعامل حلقة الحدث مع ردود الاتصال وتعيد بدء المهام.
جلب عناوين URL بالتوازي في aiohttp

توضح مخطط حالة الاستخدام (الشكل 4) كيف يمكن أن تتعامل aiohttp مع طلبات URL متعددة بالتوازي. كل عملية "جلب URL" تُعالج بالتوازي وتمريرها إلى عقدة معالجة مركزية.
يوضح هذا المخطط كيف يمكن أن تقوم aiohttp بجلب عدة URLs بشكل متزامن في سيناريو جمع البيانات من الويب أو طلب API.
مخطط العمل

يوضح مخطط العمل pipeline بيانات أساسي، يظهر خطوات الجلب، المعالجة، التنظيف، وتخزين البيانات.
مثال: إجراء طلبات غير متزامنة باستخدام aiohttp
import aiohttp
import asyncio
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
"https://jsonplaceholder.typicode.com/posts/1",
"https://jsonplaceholder.typicode.com/posts/2",
"https://jsonplaceholder.typicode.com/posts/3",
]
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
responses = await asyncio.gather(*tasks)
for i, response in enumerate(responses):
print(f"استجابة {i+1}: {response[:60]}...") # طباعة أول 60 حرفًا من كل استجابة
تشغيل حلقة الحدث
asyncio.run(main())
تنزيل المحتويات بشكل متزامن
أولًا، دعنا نجرب القيام بذلك بشكل متزامن باستخدام مكتبة requests. يمكن تثبيتها باستخدام:
pip.python3.7 -m pip install requests
تنزيل مورد عبر الإنترنت باستخدام requests أمر بسيط.
import requestsresponse = requests.get("https://www.python.org/dev/peps/pep-8010/")print(response.content)
سيقوم بطباعة المحتوى HTML لPEP 8010. لحفظه محليًا في ملف:
filename = "sync_pep_8010.html"with open(filename, "wb") as pep_file:pep_file.write(content.encode('utf-8'))سيتم إنشاء الملف sync_pep_8010.html.
حالات استخدام aiohttp في العالم الحقيقي
1. جمع البيانات من الويب
إذا كنت تقوم بجمع بيانات من عدة صفحات من موقع ويب، فإن الانتظار لتحميل كل صفحة يمكن أن يكون عملية بطيئة بشكل مؤلم. مع aiohttp، يمكنك جمع عدة صفحات في وقت واحد، مما يسرع العملية بشكل كبير. تخيل فقط جلب مئات الصفحات دفعة واحدة بدلاً من الانتظار لتحميل كل واحدة في ترتيبها.
2. طلبات API
عند العمل مع واجهات برمجة التطبيقات، خاصة تلك التي تحتوي على حدود سرعة أو تستجيب ببطء، يمكنك إرسال طلبات متعددة في وقت واحد باستخدام aiohttp. على سبيل المثال، إذا كنت تستعلم عن واجهة برمجة تطبيقات الطقس لجمع البيانات للعديد من المدن، يمكن لـ aiohttp مساعدتك في جمع النتائج بسرعة أكبر.
3. جمع البيانات
سواء كنت تعمل مع بيانات سوق الأسهم، أو تدفقات وسائل التواصل الاجتماعي، أو مواقع الأخبار، فإن aiohttp يمكن أن تكون تحولًا كبيرًا في التعامل مع كميات هائلة من طلبات HTTP في الوقت نفسه، مما يتيح لك جمع البيانات بسرعة وكفاءة أكبر.
إليك ثلاثة أمثلة عملية لاستخدام مكتبة aiohttp الخاصة ببايثون، كاملة مع الخطوات وعينة من الكود:
1. إجراء طلبات HTTP غير متزامنة
يظهر هذا المثال كيفية إجراء عدة طلبات HTTP غير متزامنة باستخدام aiohttp.
الخطوات:
- استيراد الوحدات اللازمة
- تعريف دالة غير متزامنة لجلب URL
- إنشاء قائمة من URLs لجلبها
- إعداد حلقة حدث غير متزامنة
- تشغيل الدالة غير المتزامنة لكل URL بالتوازي
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
'https://api.github.com',
'https://api.github.com/events',
'https://api.github.com/repos/python/cpython'
]
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
responses = await asyncio.gather(*tasks)
for url, response in zip(urls, responses):
print(f"URL: {url}\nطول الاستجابة: {len(response)}\n")
asyncio.run(main())
2. إنشاء خادم API بسيط
يعرض هذا المثال كيفية إنشاء خادم API أساسي باستخدام aiohttp.
الخطوات:
- استيراد الوحدات اللازمة
- تعريف معالجات المسارات
- إنشاء التطبيق وإضافة المسارات
- تشغيل التطبيق
from aiohttp import web
async def handle_root(request):
return web.json_response({"message": "مرحبًا بكم في واجهة برمجة التطبيقات"})
async def handle_users(request):
users = [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"},
{"id": 3, "name": "Charlie"}
]
return web.json_response(users)
app = web.Application()
app.add_routes([
web.get('/', handle_root),
web.get('/users', handle_users)
])
if __name__ == '__main__':
web.run_app(app)
3. خادم دردشة Websocket
يظهر هذا المثال كيفية إنشاء خادم دردشة بسيط يعتمد على Websocket باستخدام aiohttp.
الخطوات:
- استيراد الوحدات اللازمة
- إنشاء مجموعة لتخزين الـ websockets النشطة
- تعريف معالج websocket
- إنشاء التطبيق وإضافة المسارات
- تشغيل التطبيق
import aiohttp
from aiohttp import web
import asyncio
active_websockets = set()
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
active_websockets.add(ws)
try:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
for client in active_websockets:
if client != ws:
await client.send_str(f"المستخدم{id(ws)}: {msg.data}")
elif msg.type == aiohttp.WSMsgType.ERROR:
print(f"تم إغلاق اتصال WebSocket باستثناء {ws.exception()}")
finally:
active_websockets.remove(ws)
return ws
app = web.Application()
app.add_routes([web.get('/ws', websocket_handler)])
if __name__ == '__main__':
web.run_app(app)
لاختبار هذا الخادم websocket، يمكنك استخدام عميل websocket أو إنشاء صفحة HTML بسيطة باستخدام JavaScript للاتصال بالخادم.
تستعرض هذه الأمثلة جوانب مختلفة من aiohttp، بدءًا من إجراء طلبات غير متزامنة إلى إنشاء خوادم ويب والتعامل مع websockets. توفر أساسًا قويًا لبناء تطبيقات أكثر تعقيدًا باستخدام هذه المكتبة القوية.
الخاتمة
في عالم اليوم المدفوع بالبيانات، السرعة مهمة، والقدرة على التعامل مع العديد من المهام في وقت واحد يمكن أن تعطيك ميزة. تعتبر aiohttp أداة لا غنى عنها في مجموعة أدوات بايثون الخاصة بك إذا كنت تتعامل مع جمع البيانات من الويب، أو طلبات API، أو أي مهمة أخرى تتطلب إجراء العديد من طلبات HTTP.
من خلال التحول إلى البرمجة غير المتزامنة، فإنك لا توفر الوقت فقط، بل تجعل شفرتك أيضًا أكثر كفاءة وقابلية للتوسع.
لذا، إذا كنت تبحث عن رفع مستوى طلبات الويب الخاصة بك باستخدام بايثون، جرب aiohttp.
سوف ترى سريعًا لماذا تعتبر خيارًا شائعًا بين المطورين الذين يتعاملون مع التطبيقات ذات الإدخال/الإخراج الثقيل.
هل وجدت هذه الصفحة مفيدة؟ آمل أن تكون هذه مادة غنية للغاية بالنسبة لك!
أتمنى لك كل التوفيق!
