أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج
طبّق asyncio على عملاء HTTP وقوائم الانتظار ومسارات المعالجة الواقعية
أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
أفضل ممارسات حلقة الأحداث
استخدم دائمًا asyncio.run() كنقطة الدخول الوحيدة. تجنّب خلط التعليمات البرمجية المتزامنة وغير المتزامنة بلا عناية، ولا تحجب حلقة الأحداث مطلقًا بعمل طويل يستهلك وحدة المعالجة المركزية.
import asyncio
async def main():
# Never: time.sleep() — blocks the event loop
# Always: await asyncio.sleep()
await asyncio.sleep(1)
asyncio.run(main())تجميع الاتصالات
أعِد استخدام الاتصالات بدلًا من فتح اتصال جديد لكل طلب. توفّر مكتبات مثل asyncpg وaiohttp تجميعات مضمّنة.
# pip install asyncpg
import asyncpg, asyncio
async def main():
pool = await asyncpg.create_pool(
dsn="postgresql://user:pass@host/db",
min_size=5, max_size=20
)
async with pool.acquire() as conn:
row = await conn.fetchrow("SELECT 1")
await pool.close()المنتِج والمستهلك باستخدام asyncio.Queue
تفصل asyncio.Queue بين المنتجين والمستهلكين الذين يعملون كمهام متزامنة.
import asyncio
async def producer(q):
for i in range(5):
await q.put(i)
await asyncio.sleep(0.5)
await q.put(None) # sentinel
async def consumer(q):
while (item := await q.get()) is not None:
print(f"processing {item}")
q.task_done()
async def main():
q = asyncio.Queue()
await asyncio.gather(producer(q), consumer(q))
asyncio.run(main())تحديد معدل التنفيذ باستخدام Semaphore
حدّد عدد الطلبات الصادرة المتزامنة لتجنّب إرهاق واجهات API الخارجية أو تجاوز حدود معدل الطلبات.
import asyncio, aiohttp
SEM = asyncio.Semaphore(10) # 10 concurrent requests max
async def fetch(session, url):
async with SEM:
async with session.get(url) as r:
return await r.json()
async def main(urls):
async with aiohttp.ClientSession() as s:
return await asyncio.gather(*[fetch(s, u) for u in urls])إعادة المحاولة مع التراجع الأُسّي
أحط العمليات القابلة لإعادة المحاولة بمنطق التراجع الزمني للتعامل مع حالات الفشل المؤقتة بسلاسة.
import asyncio
async def retry(coro_fn, retries=3, base=1):
for attempt in range(retries):
try:
return await coro_fn()
except Exception as e:
if attempt == retries - 1: raise
delay = base * 2 ** attempt
await asyncio.sleep(delay)الإيقاف السلس
التقط asyncio.CancelledError في المهام طويلة التشغيل، وتعامل مع إشارات نظام التشغيل للإيقاف بطريقة سليمة.
import asyncio, signal
async def server():
stop = asyncio.Event()
loop = asyncio.get_running_loop()
loop.add_signal_handler(signal.SIGINT, stop.set)
await stop.wait()
print("Shutting down gracefully")استجابات البث
استخدم المولّدات غير المتزامنة لبث الاستجابات الكبيرة من دون تحميلها بالكامل إلى الذاكرة.
import asyncio, aiohttp
async def stream(url):
async with aiohttp.ClientSession() as s:
async with s.get(url) as r:
async for chunk in r.content.iter_chunked(4096):
process(chunk)
async def process(chunk):
await asyncio.sleep(0)
print(len(chunk), "bytes")المهام الخلفية في FastAPI
تضع BackgroundTasks في FastAPI العمل في قائمة انتظار ليُنفَّذ بعد إرسال الاستجابة، مما يحافظ على سرعة نقاط النهاية.
from fastapi import FastAPI, BackgroundTasks
app = FastAPI()
def send_email(to: str, body: str):
# heavy synchronous work
pass
@app.post("/register")
async def register(email: str, bg: BackgroundTasks):
bg.add_task(send_email, email, "Welcome!")
return {"status": "registered"}نمط نبضات القلب
شغّل مهمة خلفية دورية إلى جانب حلقة الخادم الرئيسية باستخدام create_task.
import asyncio
async def heartbeat():
while True:
print("alive")
await asyncio.sleep(30)
async def main():
asyncio.create_task(heartbeat())
await serve_forever()تحليل أداء التعليمات البرمجية غير المتزامنة
استخدم yappi أو py-spy لتحليل الأداء مع دعم التعليمات البرمجية غير المتزامنة. فعّل وضع تصحيح asyncio للحصول على تحذيرات بشأن الاستدعاءات البطيئة.
# Enable debug to catch slow callbacks:
# asyncio.run(main(), debug=True)
# PYTHONASYNCIODEBUG=1 python server.py
# logs: Executing <Task coroutine=...> took 0.150 secondsتجنّب الأخطاء الشائعة
القواعد الأساسية: لا تستدعِ تعليمات برمجية حاجبة داخل حلقة الأحداث مطلقًا؛ وانتظر coroutines دائمًا؛ وألغِ المهام عند الإيقاف؛ واستخدم تجميعات الاتصالات؛ وحدّد التزامن باستخدام semaphores.
import asyncio
async def bad():
import time
time.sleep(2) # blocks the entire event loop!
async def good():
await asyncio.sleep(2) # yields controlتحقق سريع
ما بنية asyncio التي تفصل بين المنتجين والمستهلكين العاملين كمهام متزامنة؟
مراجعة
أنماط التعليمات البرمجية غير المتزامنة في بيئات الإنتاج: استخدم تجميعات الاتصالات، وتحكّم في التزامن باستخدام Semaphore، وطبّق إعادة المحاولة والتراجع الزمني، وابثّ البيانات الكبيرة، وأوقف التشغيل بسلاسة عند وصول الإشارات، وشغّل المهام الدورية باستخدام create_task.
الأسئلة الشائعة
هل درس «أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج» مجاني؟
نعم — نص درس «أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج»؟
طبّق asyncio على عملاء HTTP وقوائم الانتظار ومسارات المعالجة الواقعية تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الكوروتينات وحلقة الأحداث
- await والمهام والتجميع
- مديرو السياق والمكرّرات غير المتزامنين
- أنماط الإدخال والإخراج غير المتزامن في بيئة الإنتاج