الدرس 16 من 20

العمل مع واجهات البرمجة

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

4 دقيقة للقراءة

البرمجة غير المتزامنة تتيح لك تشغيل استدعاءات API متعددة بشكل متزامن. بدلاً من انتظار اكتمال كل استدعاء، يمكنك بدء عدة في وقت واحد.

لماذا غير متزامن؟

متزامن (بطيء):
الاستدعاء 1: |-------|
الاستدعاء 2:         |-------|
الاستدعاء 3:                 |-------|
الإجمالي: ~3 ثوانٍ

غير متزامن (سريع):
الاستدعاء 1: |-------|
الاستدعاء 2: |-------|
الاستدعاء 3: |-------|
الإجمالي: ~1 ثانية

بناء جملة Async الأساسي

import asyncio

# تعريف دالة async مع 'async def'
async def fetch_data():
    print("جارٍ البدء...")
    await asyncio.sleep(1)  # انتظار غير معطّل
    print("تم!")
    return "data"

# تشغيل دالة async
result = asyncio.run(fetch_data())

HTTP غير متزامن مع aiohttp

pip install aiohttp
import aiohttp
import asyncio

async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.json()

# تشغيله
data = asyncio.run(fetch_url("https://api.example.com/data"))

إجراء استدعاءات API متزامنة

import aiohttp
import asyncio
import os

async def chat_completion(session, prompt):
    """إجراء طلب إكمال محادثة واحد."""
    url = "https://api.openai.com/v1/chat/completions"
    headers = {
        "Authorization": f"Bearer {os.getenv('OPENAI_API_KEY')}",
        "Content-Type": "application/json"
    }
    data = {
        "model": "gpt-4",
        "messages": [{"role": "user", "content": prompt}]
    }

    async with session.post(url, headers=headers, json=data) as response:
        result = await response.json()
        return result["choices"][0]["message"]["content"]

async def batch_completions(prompts):
    """معالجة مطالبات متعددة بشكل متزامن."""
    async with aiohttp.ClientSession() as session:
        tasks = [chat_completion(session, p) for p in prompts]
        results = await asyncio.gather(*tasks)
        return results

# معالجة 5 مطالبات بشكل متزامن
prompts = [
    "ما هو بايثون؟",
    "ما هو جافاسكريبت؟",
    "ما هو Rust؟",
    "ما هو Go؟",
    "ما هو Ruby؟"
]

results = asyncio.run(batch_completions(prompts))
for prompt, result in zip(prompts, results):
    print(f"س: {prompt}\nج: {result[:100]}...\n")

المفاهيم الرئيسية

المفهوم الوصف
async def تعرّف دالة coroutine
await تتوقف مؤقتاً حتى اكتمال العملية غير المتزامنة
asyncio.run() نقطة الدخول لتشغيل كود async
asyncio.gather() تشغيل coroutines متعددة بشكل متزامن
aiohttp مكتبة عميل HTTP غير متزامنة

معالجة الأخطاء في Async

async def safe_fetch(session, url):
    try:
        async with session.get(url, timeout=10) as response:
            response.raise_for_status()
            return await response.json()
    except asyncio.TimeoutError:
        print(f"انتهت المهلة: {url}")
        return None
    except aiohttp.ClientError as e:
        print(f"خطأ: {e}")
        return None

async def fetch_all(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [safe_fetch(session, url) for url in urls]
        return await asyncio.gather(*tasks)

متى تستخدم Async

استخدم Async استخدم Sync
استدعاءات API متعددة استدعاء API واحد
مهام مرتبطة بـ I/O مهام مرتبطة بـ CPU
استخراج الويب سكريبتات بسيطة
البث في الوقت الفعلي المعالجة التسلسلية

لقد أكملت وحدة العمل مع APIs! بعد ذلك، سنتعلم عن بنية المشروع. :::

اختبار

الوحدة 4: العمل مع واجهات البرمجة

خذ الاختبار