سير العمل غير المتزامن والمهام الخلفية
تحتاج الوكلاء طويلة التشغيل إلى قوائم انتظار، مثل Celery أو RQ أو Temporal؛ أعد معرّف مهمة واستطلع حالتها.
سير العمل غير المتزامن والمهام الخلفية درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.
عندما تكون دورة الطلب بطيئة جدًا
تستغرق بعض مهام الوكلاء 30 ثانية أو 5 دقائق أو ساعات. لا يمكنكم إبقاء اتصال HTTP مفتوحًا. انقلوا هذه المهام إلى وظائف خلفية غير متزامنة.
النمط
- يرسل العميل POST بالمهمة ← ينشئ الخادم وظيفة ويعيد job_id
- يلتقط العامل الوظيفة من قائمة انتظار
- يستطلع العميل GET /jobs/{id} لمعرفة الحالة
- عند الانتهاء، يعيد الخادم النتيجة
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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تقديم الوكلاء خلف API
- سير العمل غير المتزامن والمهام الخلفية
- تحديد معدل الطلبات وإدارة الحصص
- عمليات النشر Blue-Green وCanary للوكلاء