Python Academy · पाठ

प्रोडक्शन में असिंक्रोनस I/O पैटर्न

HTTP क्लाइंट, कतारों और वास्तविक दुनिया की पाइपलाइन पर asyncio लागू करें।

पाठ 4, कुल 4 में से13 चरण

प्रोडक्शन में असिंक्रोनस I/O पैटर्न, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

इवेंट लूप की सर्वोत्तम विधियाँ

एकमात्र प्रवेश बिंदु के रूप में हमेशा asyncio.run() का उपयोग करें। समकालिक और अतुल्यकालिक कोड को लापरवाही से मिलाने से बचें और लंबे CPU-प्रधान कार्य से इवेंट लूप को कभी अवरुद्ध न करें।

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 को पकड़ें और व्यवस्थित रूप से बंद करने के लिए OS संकेतों को संभालें।

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 का BackgroundTasks प्रतिक्रिया भेजे जाने के बाद चलने वाले कार्यों की कतार बनाता है, जिससे अंतिम-बिंदु तेज़ रहते हैं।

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

सामान्य समस्याओं से बचाव

मुख्य नियम: इवेंट लूप पर अवरोधक कोड कभी न चलाएँ; कोरूटीन का हमेशा await करें; बंद करते समय कार्यों को रद्द करें; कनेक्शन पूल का उपयोग करें; सेमाफ़ोर से समवर्ती कार्रवाइयों की संख्या सीमित करें।

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 से आवधिक कार्य चलाएँ।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
76
पाठ
320

अक्सर पूछे जाने वाले प्रश्न

क्या “प्रोडक्शन में असिंक्रोनस I/O पैटर्न” पाठ निःशुल्क है?

हाँ—“प्रोडक्शन में असिंक्रोनस I/O पैटर्न” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“प्रोडक्शन में असिंक्रोनस I/O पैटर्न” में मैं क्या सीखूँगा?

HTTP क्लाइंट, कतारों और वास्तविक दुनिया की पाइपलाइन पर asyncio लागू करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“प्रोडक्शन में असिंक्रोनस I/O पैटर्न” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. कॉरूटीन और इवेंट लूप
  2. await, टास्क और एकत्रीकरण
  3. असिंक्रोनस कॉन्टेक्स्ट मैनेजर और इटरेटर
  4. प्रोडक्शन में असिंक्रोनस I/O पैटर्न
← Python Academy पर वापस जाएँ