Async এবং Await কীভাবে কাজ করে?

Web Development - ফাস্টএপিআই (FastAPI) - FastAPI এর Background Tasks এবং Async Programming
186

FastAPI হল একটি Asynchronous (আসিঙ্ক্রোনাস) ওয়েব ফ্রেমওয়ার্ক, যা async এবং await ব্যবহার করে কোডের কার্যক্ষমতা এবং স্কেলেবিলিটি বৃদ্ধি করতে সক্ষম। Async এবং Await ব্যবহার করলে আপনার অ্যাপ্লিকেশন একাধিক কাজ একসাথে (concurrently) সম্পাদন করতে পারে, যার ফলে পারফরম্যান্স অনেক উন্নত হয়, বিশেষ করে বড় লোডের অ্যাপ্লিকেশনগুলির জন্য।

এখানে আলোচনা করা হবে কিভাবে async এবং await FastAPI তে কাজ করে এবং এর উপকারিতা কী।


Async এবং Await কী?

  • Async (Asynchronous):
    Async হলো এমন একটি প্রোগ্রামিং মডেল যা I/O অপারেশন (যেমন, নেটওয়ার্ক কল, ডাটাবেস অপারেশন) করার সময় কোডের execution থামিয়ে না রেখে, অন্য কাজ করতে দেয়।
  • Await:
    Await হল একটি কিওয়ার্ড যা async ফাংশনের মধ্যে ব্যবহার করা হয়। এটি কোনো Asynchronous অপারেশন সম্পন্ন হওয়ার জন্য অপেক্ষা করতে বলে, কিন্তু অন্যান্য কোড চলতে থাকে।

উদাহরণ:

async def my_function():
    # কিছু আসিঙ্ক্রোনাস কাজ করা হচ্ছে
    result = await some_async_function()
    return result

FastAPI তে Async এবং Await ব্যবহার করা

FastAPI তে async এবং await এর মাধ্যমে কোড অনেক দ্রুত এবং স্কেলেবল হয়ে ওঠে, বিশেষ করে যখন API কে অনেক রিকোয়েস্ট পরিচালনা করতে হয়।

FastAPI তে Async Function ব্যবহার:

FastAPI তে async def দিয়ে asynchronous view function বা endpoint তৈরি করা হয়। যখন আপনি await ব্যবহার করেন, তখন FastAPI অন্য রিকোয়েস্ট প্রসেস করার সময় আপনার I/O অপারেশনটি সম্পন্ন হওয়ার জন্য অপেক্ষা করে।

উদাহরণ: Async Function FastAPI তে

from fastapi import FastAPI
import asyncio

app = FastAPI()

async def fetch_data():
    await asyncio.sleep(2)  # এখানে ২ সেকেন্ড অপেক্ষা করবে
    return {"data": "Hello, World!"}

@app.get("/async-example")
async def async_example():
    result = await fetch_data()  # await করে ফাংশনটির কাজ শেষ হওয়ার জন্য
    return result

এখানে, fetch_data() একটি async function যা ২ সেকেন্ডের জন্য অপেক্ষা করে (উদাহরণস্বরূপ, নেটওয়ার্ক কল বা ডাটাবেস রিডিং)। await fetch_data() এর মাধ্যমে FastAPI এটিকে কল করে এবং অন্যান্য রিকোয়েস্ট প্রসেস করার সময় এটি অপেক্ষা করে।

রিকোয়েস্ট উদাহরণ:

GET /async-example

রেসপন্স (কিছু সময় পর):

{
  "data": "Hello, World!"
}

Async এবং Await এর উপকারিতা

  1. উচ্চ পারফরম্যান্স এবং স্কেলেবিলিটি:
    Async এবং Await ব্যবহার করার মাধ্যমে কোড একাধিক কাজ একসাথে করতে পারে, যেমন, ডাটাবেসের সাথে একাধিক কনকারেন্ট রিকোয়েস্ট হ্যান্ডল করা। এর ফলে সার্ভারের প্রতি রিকোয়েস্টের প্রতিক্রিয়া সময় (response time) কমে এবং আরও বেশি ইউজার হ্যান্ডল করা সম্ভব হয়।
  2. Non-blocking I/O অপারেশন:
    সাধারণ synchronous ফাংশনে যখন একটি I/O অপারেশন চলতে থাকে (যেমন, নেটওয়ার্ক রিকোয়েস্ট বা ডাটাবেস কল), পুরো কোড থেমে থাকে। কিন্তু Async কোডের মধ্যে, যখন একটি অপারেশন সম্পন্ন হওয়ার জন্য অপেক্ষা করা হয়, তখন অন্য কাজগুলি চলতে থাকে। এটি উচ্চ ট্র্যাফিক বা বড় অ্যাপ্লিকেশনে কার্যক্ষমতা বৃদ্ধি করে।
  3. কম সময় অপেক্ষা করা:
    Async কোড অপেক্ষার সময় কমাতে সাহায্য করে। যেমন, যখন ডাটাবেসে বা API-তে একাধিক রিকোয়েস্ট করা হয়, তখন তারা একে অপরকে ব্লক না করে একসাথে কাজ করতে পারে।

Synchronous vs Asynchronous: কী পার্থক্য?

  • Synchronous:
    একে একে কাজ করে, প্রতিটি ফাংশন পরবর্তী ফাংশন শুরু করার আগে শেষ হতে হবে।

    উদাহরণ:

    def get_data():
        result = db_query()  # থামিয়ে রাখে যখন ডাটাবেস থেকে ডাটা আসে না
        return result
    
  • Asynchronous:
    একসাথে একাধিক কাজ সম্পন্ন করতে সক্ষম। যখন কোনো একক কাজ শেষ হতে সময় নেয়, তখন অন্য কাজ করতে পারে।

    উদাহরণ:

    async def get_data():
        result = await db_query()  # অন্য কাজ চলতে থাকে যখন ডাটাবেস থেকে ডাটা আসে
        return result
    

Real-world Example: Database Querying with Async

ধরা যাক, আমরা একটি ডাটাবেসে কুইরি পাঠাচ্ছি এবং আমরা চাই যে আমাদের API তে একাধিক রিকোয়েস্ট হ্যান্ডল করার সময় ডাটাবেস থেকে ডাটা সংগ্রহ করা হোক।

from fastapi import FastAPI
import databases  # Async DB client

DATABASE_URL = "sqlite:///./test.db"

database = databases.Database(DATABASE_URL)

app = FastAPI()

@app.on_event("startup")
async def startup():
    await database.connect()

@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

@app.get("/users/")
async def get_users():
    query = "SELECT * FROM users"
    results = await database.fetch_all(query)  # Async DB query
    return results

এখানে, আমরা databases প্যাকেজ ব্যবহার করে ডাটাবেস থেকে অ্যাসিঙ্ক্রোনাস কোয়েরি করছি। await ব্যবহার করে FastAPI অপেক্ষা করছে, তবে অন্যান্য রিকোয়েস্ট হ্যান্ডলিং চলতে থাকে।


Error Handling with Async

FastAPI তে asynchronous কোড ব্যবহারের সময়, আপনি সাধারণভাবে try-except ব্লক ব্যবহার করতে পারেন এবং অ্যাসিঙ্ক্রোনাস ফাংশনেও async ত্রুটি পরিচালনা করতে পারেন।

@app.get("/fetch-data/")
async def fetch_data():
    try:
        result = await fetch_data_from_db()
        return result
    except Exception as e:
        return {"error": str(e)}

FastAPI তে async এবং await ব্যবহারের মাধ্যমে অ্যাপ্লিকেশন আরও দ্রুত এবং স্কেলেবল হয়ে ওঠে। আপনি যখন I/O-বাঁধিত কাজ (যেমন ডাটাবেস অ্যাক্সেস, নেটওয়ার্ক কল) করবেন, তখন async এবং await ব্যবহারের মাধ্যমে আপনার কোড আরও কার্যকর হবে এবং সার্ভারের পারফরম্যান্স বৃদ্ধি পাবে। FastAPI এর সাথে asynchronous programming আপনাকে উচ্চ লোড সহ API তৈরি করতে সহায়ক, যা সিস্টেমের রেসপন্স টাইম এবং ক্ষমতা বাড়াতে সাহায্য করে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...