AI Agents · درس

سير العمل غير المتزامن والمهام الخلفية

تحتاج الوكلاء طويلة التشغيل إلى قوائم انتظار، مثل Celery أو RQ أو Temporal؛ أعد معرّف مهمة واستطلع حالتها.

الدرس 2 من 415 خطوة

سير العمل غير المتزامن والمهام الخلفية درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

عندما تكون دورة الطلب بطيئة جدًا

تستغرق بعض مهام الوكلاء 30 ثانية أو 5 دقائق أو ساعات. لا يمكنكم إبقاء اتصال HTTP مفتوحًا. انقلوا هذه المهام إلى وظائف خلفية غير متزامنة.

النمط

  1. يرسل العميل POST بالمهمة ← ينشئ الخادم وظيفة ويعيد job_id
  2. يلتقط العامل الوظيفة من قائمة انتظار
  3. يستطلع العميل GET /jobs/{id} لمعرفة الحالة
  4. عند الانتهاء، يعيد الخادم النتيجة

Submit Endpoint

from uuid import uuid4

@app.post('/jobs')
def submit(req: AgentRequest):
    job_id = str(uuid4())
    redis.hset(f'job:{job_id}', mapping={'status': 'queued', 'user_id': req.user_id})
    queue.enqueue('run_agent_job', job_id, req.query)
    return {'job_id': job_id, 'status': 'queued'}

Status Endpoint

@app.get('/jobs/{job_id}')
def status(job_id: str):
    data = redis.hgetall(f'job:{job_id}')
    if not data:
        raise HTTPException(404)
    return {
        'status': data['status'],
        'result': data.get('result'),
        'error': data.get('error')
    }

العامل

تستهلك عملية منفصلة قائمة الانتظار:

def run_agent_job(job_id, query):
    redis.hset(f'job:{job_id}', 'status', 'running')
    try:
        result = run_agent(query)
        redis.hset(f'job:{job_id}', mapping={'status': 'done', 'result': result})
    except Exception as e:
        redis.hset(f'job:{job_id}', mapping={'status': 'failed', 'error': str(e)})

خيارات قوائم الانتظار

  • RQ (Redis Queue) — Python بسيط
  • Celery — الخيار التقليدي في Python، مع الكثير من الميزات
  • Temporal — سير عمل متين، وإعادات محاولة، وقابلية للمراقبة
  • Dramatiq — بديل لـ Celery
  • Cloud-native — Cloud Tasks وSQS وPub/Sub

Temporal لسير العمل المتين

تتسم سير عمل الوكلاء بالحالة. ولذلك يُعد نموذج التنفيذ المتين في Temporal مناسبًا جدًا:

import temporalio

@temporalio.workflow.defn
class AgentWorkflow:
    @temporalio.workflow.run
    async def run(self, query: str) -> str:
        plan = await workflow.execute_activity(plan_step, query, schedule_to_close_timeout=timedelta(minutes=2))
        results = await workflow.execute_activity(execute_step, plan, schedule_to_close_timeout=timedelta(minutes=10))
        return await workflow.execute_activity(synthesise_step, results)

تحديثات جزئية متدفقة

تستفيد الوظائف طويلة التشغيل من تحديثات التقدم. استخدموا Server-Sent Events أو WebSockets:

@app.get('/jobs/{job_id}/stream')
def stream_progress(job_id):
    def gen():
        while True:
            update = redis.brpop(f'updates:{job_id}', timeout=30)
            if not update:
                yield 'data: {"status": "timeout"}\n\n'
                break
            yield f'data: {update[1].decode()}\n\n'
            if 'done' in update[1].decode():
                break
    return StreamingResponse(gen(), media_type='text/event-stream')

مدد صلاحية الوظائف

لا تحتفظوا بسجلات الوظائف إلى الأبد:

redis.expire(f'job:{job_id}', 86400)   # 1 day

إعادات المحاولة

تُعاد محاولة الإخفاقات المؤقتة تلقائيًا، بينما تُرسل الإخفاقات الدائمة إلى DLQ لمراجعتها من قِبل البشر:

import time

def retry(retries=3, retry_backoff=True):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for attempt in range(1, retries + 1):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f'attempt {attempt} failed: {e}')
                    if attempt == retries:
                        raise
            return None
        return wrapper
    return decorator

attempts = {'n': 0}

@retry(retries=3, retry_backoff=True)
def run_agent_job(job_id):
    attempts['n'] += 1
    if attempts['n'] < 3:
        raise RuntimeError('transient error')
    return f'job {job_id} done'

print(run_agent_job('job-1'))

حدود التزامن

للتحكم في تكاليف GPU وواجهات API، حدّدوا عدد العمال المتزامنين:

rq worker --burst --max-jobs 1000 --queue agent

# Or per-queue concurrency in Temporal worker config.

حصص كل مستخدم

تتبّعوا الوظائف قيد التنفيذ لكل مستخدم:

key = f'inflight:{user_id}'
if redis.scard(key) >= 5:
    raise HTTPException(429, 'Too many in-flight jobs')
redis.sadd(key, job_id)

قابلية المراقبة

تتبّعوا كل وظيفة من البداية إلى النهاية. أضيفوا إلى الامتدادات الوسوم job_id وuser_id. ينبغي أن تفتح الوظائف الفاشلة تذكرة أو تطلق تنبيهًا تلقائيًا.

نمط استطلاع الحالة

لماذا نستخدم نمط الإرسال ثم استطلاع الحالة للوكلاء طويلة التشغيل؟

مراجعة

أرسلوا الوظيفة عبر POST، وأعيدوا المعرّف، ثم يعالج العامل الوظيفة من قائمة الانتظار، ويستطلع العميل الحالة. استخدموا RQ أو Celery للحالات البسيطة، وTemporal لسير العمل ذي الحالة. أضيفوا مدد الصلاحية وإعادات المحاولة والحصص وآثار التتبع.

البدء مجانًا

تعلم AI Agents مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
60
الدروس
239

الأسئلة الشائعة

هل درس «سير العمل غير المتزامن والمهام الخلفية» مجاني؟

نعم — نص درس «سير العمل غير المتزامن والمهام الخلفية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «سير العمل غير المتزامن والمهام الخلفية»؟

تحتاج الوكلاء طويلة التشغيل إلى قوائم انتظار، مثل Celery أو RQ أو Temporal؛ أعد معرّف مهمة واستطلع حالتها. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «سير العمل غير المتزامن والمهام الخلفية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تقديم الوكلاء خلف API
  2. سير العمل غير المتزامن والمهام الخلفية
  3. تحديد معدل الطلبات وإدارة الحصص
  4. عمليات النشر Blue-Green وCanary للوكلاء
← العودة إلى AI Agents