Asynchronous Programming এবং async/await এর প্রয়োগ

Concurrency এবং Multithreading (কনকারেন্সি এবং মাল্টিথ্রেডিং) - রাস্ট (Rust) - Computer Programming

250

Asynchronous Programming (অ্যাসিনক্রোনাস প্রোগ্রামিং)

Asynchronous programming (অ্যাসিনক্রোনাস প্রোগ্রামিং) এমন একটি প্রোগ্রামিং প্যাটার্ন যেখানে কাজের একটি অংশ চালানো হয় এবং অন্য অংশগুলো একই সময়ে চালু থাকে, না যে কাজের সমাপ্তি পর্যন্ত অপেক্ষা করা হয়। এতে প্রোগ্রামটির কার্যক্ষমতা বৃদ্ধি পায়, কারণ যখন এক কার্যকলাপ অন্য এক কার্যকলাপের জন্য অপেক্ষা করে (যেমন ডাটাবেস কল বা নেটওয়ার্ক রিকুয়েস্ট), তখন এই সময়ের মধ্যে অন্য কাজ করা যায়।

এটি বিশেষভাবে I/O-bound (ইনপুট/আউটপুট সম্পর্কিত কাজ) অ্যাপ্লিকেশনগুলির জন্য কার্যকরী, যেখানে প্রোগ্রামটি অনেক সময় নেটওয়ার্ক রিকুয়েস্ট বা ডিস্ক অপারেশনগুলির জন্য অপেক্ষা করে।

Rust এ Asynchronous Programming

রাস্টে অ্যাসিনক্রোনাস প্রোগ্রামিং async এবং await কিওয়ার্ড ব্যবহার করে পরিচালিত হয়। রাস্টের অ্যাসিনক্রোনাস প্রোগ্রামিং সাধারণত async ফাংশন ডিফাইন করা হয় এবং এই ফাংশনগুলিকে অন্য ফাংশন থেকে কল করার জন্য await কিওয়ার্ড ব্যবহৃত হয়।

২.১ async ফাংশন

রাস্টে, async কিওয়ার্ড ফাংশনের আগে ব্যবহার করে একটি অ্যাসিনক্রোনাস ফাংশন তৈরি করা হয়। অ্যাসিনক্রোনাস ফাংশনটি একটি Future রিটার্ন করে, যা আসলে ভবিষ্যতে কোনো মান ফেরত দেওয়ার প্রতিশ্রুতি দেয়।

async fn fetch_data() -> String {
    "Data fetched".to_string()
}

এখানে fetch_data একটি অ্যাসিনক্রোনাস ফাংশন যা ভবিষ্যতে "Data fetched" স্ট্রিং ফেরত দেওয়ার প্রতিশ্রুতি দেয়।

২.২ await কিওয়ার্ড

যখন একটি অ্যাসিনক্রোনাস ফাংশন কল করা হয়, তখন আমরা await কিওয়ার্ড ব্যবহার করি, যার মাধ্যমে ফাংশনের ফলাফল পাওয়ার জন্য অপেক্ষা করা হয়।

async fn fetch_data() -> String {
    "Data fetched".to_string()
}

async fn main() {
    let result = fetch_data().await;
    println!("{}", result);
}

এখানে fetch_data().await কল করার মাধ্যমে আমরা অ্যাসিনক্রোনাস ফাংশনটি থেকে ফলাফল অপেক্ষা করছি। await কিওয়ার্ড কেবলমাত্র অ্যাসিনক্রোনাস ফাংশনের ভিতরে ব্যবহার করা যায়।


Asynchronous Programming এর প্রয়োগ

রাস্টে অ্যাসিনক্রোনাস প্রোগ্রামিং সাধারণত ফাইল সিস্টেম অপারেশন, নেটওয়ার্ক রিকুয়েস্ট, এবং দীর্ঘ সময় স্থায়ী প্রসেসিং এর মতো কাজগুলোতে ব্যবহৃত হয়, যাতে প্রোগ্রামটি একসময়েকেই একাধিক কাজ সম্পাদন করতে সক্ষম হয়।

৩.১ নেটওয়ার্ক রিকুয়েস্ট (Networking Requests)

নেটওয়ার্ক রিকুয়েস্টের জন্য সাধারণত অ্যাসিনক্রোনাস ফাংশন ব্যবহৃত হয়, কারণ এই রিকুয়েস্টের জন্য অপেক্ষা করার সময় প্রোগ্রামকে অন্য কাজ করতে সক্ষম হওয়া দরকার।

উদাহরণ:

use reqwest;

async fn fetch_website() -> Result<String, reqwest::Error> {
    let response = reqwest::get("https://www.rust-lang.org").await?;
    let body = response.text().await?;
    Ok(body)
}

#[tokio::main]
async fn main() {
    match fetch_website().await {
        Ok(body) => println!("Website content fetched successfully."),
        Err(e) => println!("Error fetching website: {}", e),
    }
}

এখানে, fetch_website একটি অ্যাসিনক্রোনাস ফাংশন যা HTTP রিকুয়েস্ট করে এবং রেসপন্সের জন্য অপেক্ষা করে।

৩.২ ডাটাবেস অপারেশন (Database Operations)

অ্যাসিনক্রোনাস প্রোগ্রামিং ডাটাবেস অপারেশনেও ব্যবহৃত হতে পারে। যখন ডাটাবেসে একটি দীর্ঘ প্রক্রিয়া চলছে, তখন প্রোগ্রামটি অ্যাসিনক্রোনাসভাবে ডাটাবেস রিকুয়েস্ট করে এবং এর পরবর্তী কাজগুলি অব্যাহত রাখে।

উদাহরণ:

use tokio_postgres::{NoTls, Error};

async fn query_database() -> Result<String, Error> {
    let (client, connection) = tokio_postgres::connect("host=localhost user=postgres", NoTls).await?;
    
    tokio::spawn(async move {
        if let Err(e) = connection.await {
            eprintln!("Connection error: {}", e);
        }
    });

    let rows = client.query("SELECT name FROM users", &[]).await?;
    let result = rows.iter().map(|row| row.get::<_, String>(0)).collect::<Vec<_>>().join(", ");
    
    Ok(result)
}

#[tokio::main]
async fn main() {
    match query_database().await {
        Ok(names) => println!("Fetched user names: {}", names),
        Err(e) => eprintln!("Error fetching data: {}", e),
    }
}

এখানে, query_database একটি অ্যাসিনক্রোনাস ডাটাবেস কুয়েরি ফাংশন যা অ্যাসিনক্রোনাসভাবে ডাটাবেস রিকুয়েস্ট করে এবং ফলাফল ফেরত দেয়।

৩.৩ UI অ্যাপ্লিকেশন (UI Applications)

অ্যাসিনক্রোনাস প্রোগ্রামিংকে UI অ্যাপ্লিকেশন বা গেম ডেভেলপমেন্ট-এ ব্যবহার করা হয়, যেখানে ইভেন্টগুলি একে অপরের সাথে সম্পাদিত হতে থাকে। এই ক্ষেত্রেও অ্যাসিনক্রোনাস কোড ব্যবহার করে UI থ্রেড ব্লক না হয়ে একাধিক কার্যকলাপ একসাথে সম্পন্ন হতে পারে।


async/await এর সুবিধা

  • পারফরম্যান্স উন্নতি: অ্যাসিনক্রোনাস প্রোগ্রামিং নেটওয়ার্ক, I/O বা অন্যান্য দীর্ঘ-সময়ের কাজগুলির জন্য পারফরম্যান্সে উন্নতি ঘটায়, কারণ একে একে একাধিক কাজ পরিচালিত হতে পারে।
  • সাদৃশ্যপূর্ণ কোড: অ্যাসিনক্রোনাস কোড সাধারণত সিঙ্ক্রোনাস কোডের মতোই দেখতে হয়, কারণ আমরা await ব্যবহার করি যা বুঝতে সহজ।
  • এনার্জি সঞ্চয়: অ্যাসিনক্রোনাস কোড হালকা কাজের জন্য থ্রেড ব্লক না হয়ে প্রোগ্রাম চালিয়ে যেতে সাহায্য করে, যা কম শক্তি খরচে কাজ সম্পাদন করতে সহায়তা করে।

সারাংশ

রাস্টে async এবং await কিওয়ার্ডগুলি অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের মূল অংশ। অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের মাধ্যমে বিভিন্ন I/O বা নেটওয়ার্ক রিকুয়েস্টের জন্য অপেক্ষা না করে প্রোগ্রাম একাধিক কাজ একসাথে করতে পারে। এটি নেটওয়ার্ক রিকুয়েস্ট, ডাটাবেস কুয়েরি, UI অ্যাপ্লিকেশন এবং অন্যান্য ক্ষেত্রে কার্যকরীভাবে ব্যবহৃত হয়। async ফাংশন Future রিটার্ন করে, এবং await কিওয়ার্ড ব্যবহার করে অ্যাসিনক্রোনাস কাজের ফলাফল গ্রহণ করা হয়।

Content added By
Promotion

Are you sure to start over?

Loading...