Async এবং Await এর মৌলিক ধারণা

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

230

Rust-এ async এবং await হল অর্ন্তগত কার্যক্রম বা কনকারেন্ট প্রোগ্রামিংয়ের জন্য ব্যবহৃত প্রধান কিওয়ার্ড। এগুলি প্রোগ্রামের কার্যক্রমের সমান্তরাল এক্সিকিউশন পরিচালনার জন্য ব্যবহৃত হয়, যা IO অপারেশন, নেটওয়ার্ক রিকোয়েস্ট, এবং ডাটাবেস অ্যাক্সেসের মতো দীর্ঘস্থায়ী কাজের জন্য বিশেষভাবে উপকারী।

১. Async কিওয়ার্ড

async কিওয়ার্ডটি ফাংশন বা ব্লককে অ্যাসিঙ্ক্রোনাস হিসেবে চিহ্নিত করে, অর্থাৎ এটি ব্লকিং ছাড়া কাজ করবে এবং সম্পূর্ণ হওয়ার আগে অন্যান্য কাজ করতে পারবে।

Rust-এ যখন আপনি একটি ফাংশনকে async চিহ্নিত করেন, তখন এটি একটি ফিউচার (Future) টাইপের মান রিটার্ন করে, যা পরে অ্যাসিঙ্ক্রোনাসভাবে সম্পন্ন হবে।

উদাহরণ:

async fn fetch_data() {
    println!("Data is being fetched asynchronously.");
}

এই ফাংশনটি fetch_data অ্যাসিঙ্ক্রোনাস ফাংশন, যেটি যখন কল করা হবে, তখন এটি একটি ফিউচার রিটার্ন করবে এবং কাজটি সিঙ্ক্রোনাস ফাংশনের মতো ব্লক করবে না। এটি কার্যকরভাবে অন্য কাজ করার সুযোগ প্রদান করবে যতক্ষণ না fetch_data সম্পূর্ণ হয়।


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

await কিওয়ার্ডটি শুধুমাত্র একটি অ্যাসিঙ্ক্রোনাস ফাংশনের ভিতরে ব্যবহৃত হতে পারে এবং এটি একটি ফিউচার রেজাল্টের জন্য অপেক্ষা করে। এটি কার্যকলাপের জন্য non-blocking পদ্ধতিতে কাজ করে, অর্থাৎ এটি কার্যকরী হওয়ার জন্য অন্য কাজের জন্য অপেক্ষা করবে, কিন্তু পুরো প্রোগ্রাম বা থ্রেডের কার্যকলাপ থামবে না।

উদাহরণ:

async fn fetch_data() -> String {
    // কিছু ডেটা ফেচ করার কার্যক্রম
    String::from("Fetched Data")
}

async fn process_data() {
    let data = fetch_data().await;  // এখানে await ব্যবহার হচ্ছে
    println!("{}", data);
}

এখানে, fetch_data().await ফাংশনটি fetch_data ফাংশনের পূর্ণতা আসার জন্য অপেক্ষা করবে। এর পর data ভ্যারিয়েবলটি আসবে, এবং তারপর সেই ডেটার সাথে কাজ করা হবে।


৩. ফিউচার (Future)

Rust-এ Future হল একটি ট্রেট যা অ্যাসিঙ্ক্রোনাস অপারেশনের ফলাফল ধারণ করে। যখন আপনি async ফাংশনটি কল করেন, তখন আপনি একটি Future রিটার্ন পাবেন, যা পরে await ব্যবহার করে মুলতু হবে।

ফিউচার কীভাবে কাজ করে?

ফিউচার একটি মান ধারণ করে যা সম্পূর্ণ হতে কিছু সময় নেবে। এটি অনেকটা Promise এর মতো, যা JavaScript-এ ব্যবহৃত হয়।

উদাহরণ:

use std::future::Future;

fn fetch_data() -> impl Future<Output = String> {
    async {
        // কিছু সময়ব্যাপী কাজের পর
        "Fetched Data".to_string()
    }
}

এখানে, fetch_data একটি ফিউচার রিটার্ন করছে, যেটি অ্যাসিঙ্ক্রোনাসভাবে সম্পন্ন হবে এবং String টাইপের ফলাফল দিবে।


৪. Async এর ব্যবহার ও উপকারিতা

  • Non-blocking I/O: Async এবং await ব্যবহার করার মাধ্যমে আপনি I/O অপারেশনগুলি ব্লক না করে একসাথে অনেকগুলি অপারেশন করতে পারেন। এটি আপনার প্রোগ্রামকে দ্রুত এবং কার্যকরী করে তোলে, বিশেষত যখন আপনি নেটওয়ার্ক রিকোয়েস্ট বা ডাটাবেস কোয়েরি চালাচ্ছেন।
  • Concurrency: Async-এ একাধিক কার্যকলাপ একসাথে সম্পন্ন করা যায়, যার মাধ্যমে আপনার প্রোগ্রামের কার্যক্ষমতা বৃদ্ধি পায় এবং বিভিন্ন কাজ একসাথে করতে পারেন।

৫. প্র্যাকটিক্যাল উদাহরণ: Async এবং Await ব্যবহার করা

ধরা যাক, আমাদের একটি নেটওয়ার্ক রিকোয়েস্ট করতে হবে। এখানে আমরা একটি অ্যাসিঙ্ক্রোনাস HTTP রিকোয়েস্ট ফাংশন তৈরি করব।

উদাহরণ:

use tokio::time::sleep;
use std::time::Duration;

async fn fetch_data_from_server() -> String {
    println!("Starting to fetch data...");
    sleep(Duration::from_secs(2)).await;  // ২ সেকেন্ডের জন্য অপেক্ষা
    String::from("Data fetched from server")
}

async fn process_data() {
    let data = fetch_data_from_server().await;
    println!("{}", data);
}

#[tokio::main]
async fn main() {
    process_data().await;
}

এখানে, fetch_data_from_server একটি অ্যাসিঙ্ক্রোনাস ফাংশন যা নেটওয়ার্ক রিকোয়েস্টের মত কাজ করতে পারে এবং sleep ফাংশনটি tokio লাইব্রেরি থেকে এসেছে, যা সিমুলেট করে যে আমরা কিছু সময় অপেক্ষা করছি। পুরো প্রোগ্রামটি অ্যাসিঙ্ক্রোনাসভাবে চলে।


৬. টোকিও (Tokio) এবং অ্যাসিঙ্ক্রোনাস ইভেন্ট লুপ

Rust-এ অ্যাসিঙ্ক্রোনাস কোড পরিচালনা করতে আপনি Tokio বা async-std মতো লাইব্রেরি ব্যবহার করতে পারেন। Tokio হল একটি সিঙ্ক্রোনাস ড্রাইভেন অ্যাসিঙ্ক্রোনাস রানটাইম যা Rust-এ অ্যাসিঙ্ক্রোনাস I/O পরিচালনার জন্য খুবই জনপ্রিয়। এটি সাপোর্ট করে টাইমআউট, সিগন্যালিং, এবং অন্যান্য সুবিধা।

[dependencies]
tokio = { version = "1", features = ["full"] }

সারাংশ

Async এবং await হল Rust-এর শক্তিশালী কনকারেন্সি এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং সমাধান। async কিওয়ার্ড ফাংশনগুলিকে অ্যাসিঙ্ক্রোনাস তৈরি করে এবং await কিওয়ার্ডে ফিউচার মানের জন্য অপেক্ষা করে, যাতে কোডের কার্যকলাপ ব্লক না হয়ে অন্যান্য কাজও চলতে থাকে। Tokio বা async-std এর মতো রানটাইম ব্যবহারের মাধ্যমে অ্যাসিঙ্ক্রোনাস কাজগুলো আরো কার্যকরীভাবে পরিচালনা করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...