Skill

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

রাস্ট (Rust) - Computer Programming

216

অ্যাসিনক্রোনাস প্রোগ্রামিং হল এমন একটি প্রোগ্রামিং প্যাটার্ন যা নির্দিষ্ট কাজগুলোকে একে অপরের সাথে ব্লক না করে প্যারালালভাবে সম্পন্ন করতে সাহায্য করে। সাধারণত, যখন কোনো কাজ অনেক সময় নেয় (যেমন I/O অপারেশন, নেটওয়ার্ক রিকোয়েস্ট), তখন অ্যাসিনক্রোনাস প্রোগ্রামিং ওই কাজগুলোকে চলতে দিয়ে অন্য কাজগুলো সম্পন্ন হতে দেয়, যাতে সার্ভারের বা অ্যাপ্লিকেশনের পারফরম্যান্স কম না হয়। এতে প্রোগ্রাম অপেক্ষা না করে অন্যান্য কাজ করতে পারে, যাকে non-blocking বলা হয়।

এটি সাধারণত callback, promises বা async/await কৌশল ব্যবহার করে বাস্তবায়িত হয়।


Rust-এ অ্যাসিনক্রোনাস প্রোগ্রামিং

Rust-এ অ্যাসিনক্রোনাস প্রোগ্রামিং প্রধানত async/await কৌশল দ্বারা করা হয়। এটি async ফাংশন এবং await কীওয়ার্ড ব্যবহার করে লেখা হয়, যা asynchronous কোড লেখা সহজ এবং পরিষ্কার করে।

১. async ফাংশন

Rust-এ async ফাংশন একটি asynchronous ফাংশন, যা একটি Future রিটার্ন করে। Future হল একটি টাইপ যা এখনও সম্পন্ন হয়নি এমন কোনো কাজের রেজাল্ট প্রতিনিধিত্ব করে।

async fn say_hello() {
    println!("Hello, world!");
}

এখানে, say_hello() একটি asynchronous ফাংশন যা একটি Future রিটার্ন করে, কিন্তু কোড ব্লকটি ততক্ষণ সম্পন্ন হবে না যতক্ষণ না await ব্যবহার করা হয়।

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

await কীওয়ার্ড ব্যবহার করে আপনি একটি Future এর ফলাফল পাওয়ার জন্য অপেক্ষা করতে পারেন।

async fn say_hello() {
    println!("Hello, world!");
}

async fn main() {
    say_hello().await; // Awaiting the future returned by say_hello
}

এখানে, say_hello().await এর মাধ্যমে say_hello() ফাংশনের asynchronous কাজ শেষ হতে পর্যন্ত অপেক্ষা করা হচ্ছে।


Rust-এ Asynchronous Programming এর জন্য প্রয়োজনীয় লাইব্রেরি

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

Tokio ব্যবহার করা:

  1. Cargo.toml ফাইল আপডেট করা:

    প্রথমে, আপনার Cargo.toml ফাইলে Tokio যোগ করতে হবে:

    [dependencies]
    tokio = { version = "1", features = ["full"] }
  2. Tokio দিয়ে অ্যাসিনক্রোনাস কাজ:

    এবার আপনি Tokio ব্যবহার করে অ্যাসিনক্রোনাস কাজ করতে পারবেন। উদাহরণস্বরূপ, নেটওয়ার্ক রিকোয়েস্ট করা:

    use tokio;
    
    async fn fetch_data() {
        println!("Fetching data...");
        // এখানে নেটওয়ার্ক বা I/O অপারেশন করা যেতে পারে
    }
    
    #[tokio::main]
    async fn main() {
        fetch_data().await;
    }

    এখানে, #[tokio::main] মেক্রো ব্যবহার করা হয়েছে যা অ্যাসিনক্রোনাস main ফাংশন তৈরি করে এবং await কীওয়ার্ডের মাধ্যমে fetch_data() ফাংশনটি সমাপ্ত হতে অপেক্ষা করা হয়।


অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের সুবিধা এবং প্রয়োগ

১. পারফরম্যান্স বৃদ্ধি

অ্যাসিনক্রোনাস প্রোগ্রামিং ব্যবহারে, সিস্টেম একাধিক কাজ একসাথে (parallely) করতে পারে, যা ডেডটাইম (যেমন I/O অপারেশন, নেটওয়ার্ক রিকোয়েস্ট) কমায় এবং সাধারণভাবে পারফরম্যান্স উন্নত করে।

২. অপ্টিমাইজড রিসোর্স ব্যবহার

অ্যাসিনক্রোনাস প্রোগ্রামিং আরো বেশি কার্যকর যখন আমরা কম রিসোর্স ব্যবহার করতে চাই। I/O ব্লকিং অপারেশনগুলিকে অপেক্ষায় রেখে CPU রিসোর্স অপচয় বন্ধ করা সম্ভব হয়।

৩. নেটওয়ার্ক এবং Web Servers

অ্যাসিনক্রোনাস প্রোগ্রামিং অত্যন্ত কার্যকরী নেটওয়ার্ক অ্যাপ্লিকেশন যেমন ওয়েব সার্ভার এবং HTTP ক্লায়েন্ট তৈরি করার ক্ষেত্রে। Rust-এর Tokio এবং async-std লাইব্রেরি ওয়েব সার্ভার তৈরিতে বিশেষভাবে ব্যবহৃত হয়।


সারাংশ

অ্যাসিনক্রোনাস প্রোগ্রামিং প্রোগ্রামিং এর একটি গুরুত্বপূর্ণ কৌশল যা দীর্ঘ-running কাজগুলিকে এমনভাবে পরিচালনা করে যাতে মূল থ্রেড ব্লক না হয়, যেমন নেটওয়ার্ক অপারেশন, ডিস্ক I/O ইত্যাদি। Rust-এ অ্যাসিনক্রোনাস প্রোগ্রামিং async এবং await কীওয়ার্ড ব্যবহার করে সহজভাবে করা সম্ভব। Tokio এবং async-std লাইব্রেরি ব্যবহার করে আপনি কার্যকরী অ্যাসিনক্রোনাস ওয়েব সার্ভিস এবং নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করতে পারেন।

Content added By

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

Rust-এ Futures এবং Tasks আসলে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং (asynchronous programming) এর মূল অংশ। এগুলি আপনাকে কোডের একাধিক অংশকে একসাথে কার্যকর করতে সাহায্য করে, বিশেষ করে যখন কিছু কাজ অপেক্ষা করার জন্য (যেমন নেটওয়ার্ক কল, ফাইল সিস্টেম অপারেশন, বা অন্য কোনো IO অপারেশন) সময় নেয়।

  • Future: এটি একটি মানের প্রতিনিধিত্ব যা এখনো প্রস্তুত হয়নি কিন্তু ভবিষ্যতে হবে।
  • Task: এটি আসলে একটি অ্যাসিঙ্ক্রোনাস কাজ যা রান হচ্ছে এবং যার একটি ভবিষ্যত মান (future) হতে পারে।

এগুলো প্রধানত অ্যাসিঙ্ক্রোনাস এবং কনকারেন্ট প্রোগ্রামিংয়ে ব্যবহৃত হয়, যেখানে বিভিন্ন কাজ একসাথে সম্পাদিত হয়।


Future-এর ধারণা

Future হল একটি ডেটা স্ট্রাকচার যা একটি পরবর্তী মান ধারণ করে, যেটি ভবিষ্যতে প্রাপ্ত হবে। অ্যাসিঙ্ক্রোনাস কোডে, ফাংশনগুলি সাধারণত Future রিটার্ন করে। আপনি যখন await ব্যবহার করেন, তখন এটি অপেক্ষা করে যে Future সম্পন্ন হবে এবং তার পরে মানটি ফেরত আসবে।

উদাহরণ:

use std::future::Future;

async fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let future = add(5, 3);  // Future তৈরি হচ্ছে
    println!("Result: {}", futures::executor::block_on(future));  // Future await করা
}

এখানে, add ফাংশনটি একটি Future রিটার্ন করছে, যা অ্যাসিঙ্ক্রোনাসভাবে a এবং b যোগফল হিসাব করে। futures::executor::block_on() ফাংশন ব্যবহার করা হয়েছে যাতে Future রেজাল্টে ওয়েট করা যায় এবং তারপরে ফলাফল পাওয়া যায়।


Futures এবং Tasks এর মধ্যে সম্পর্ক

Future একটি আসন্ন মানকে প্রতিনিধিত্ব করে, কিন্তু এটি নিজে কিছু কাজ করতে পারে না যতক্ষণ না তা poll করা হয়। Task হল একটি কাজ যা একটি Future তৈরি করে এবং এটি চালানো শুরু করে। Task কে স্পন করা এবং চালানো মূলত executor বা অন্য কোনো টাস্ক রানার দ্বারা করা হয়।

Tasks এগুলিই আসলে অ্যাসিঙ্ক্রোনাস কাজ চালায়। Rust-এ অ্যাসিঙ্ক্রোনাস ফাংশনগুলি সাধারণত Future টাইপ রিটার্ন করে, এবং সেই Future কে task::spawn বা block_on ব্যবহার করে রান করা হয়।

Task উদাহরণ:

use tokio;  // Tokio crate ব্যবহৃত হচ্ছে
use tokio::task;

async fn example_task() {
    println!("Task is running!");
}

#[tokio::main]
async fn main() {
    let task = task::spawn(example_task());
    task.await.unwrap();  // Task রান করা এবং অপেক্ষা করা
}

এখানে, task::spawn ব্যবহৃত হয়েছে example_task রান করার জন্য, এবং task.await.unwrap() এর মাধ্যমে আমরা নিশ্চিত করছি যে টাস্কটি শেষ হয়ে যাবে এবং ত্রুটি থাকলে সেটা হ্যান্ডেল করা হবে।


await এবং block_on ব্যবহারের পার্থক্য

  • await: async ফাংশন বা ফিউচারের জন্য ব্যবহৃত হয়, যা অ্যাসিঙ্ক্রোনাসভাবে কাজ করার সময় কাজের ফলাফল ফেরত নিয়ে আসে।
  • block_on: এটি অ্যাসিঙ্ক্রোনাস কোডকে সিঙ্ক্রোনাস করে ফেলে, অর্থাৎ অ্যাসিঙ্ক্রোনাস কাজ শেষ না হওয়া পর্যন্ত অন্যান্য কোড চলতে পারে না।

await উদাহরণ:

async fn do_work() -> i32 {
    42
}

fn main() {
    let result = tokio::runtime::Runtime::new().unwrap().block_on(do_work());
    println!("Result: {}", result);
}

এখানে block_on ব্যবহার করে অ্যাসিঙ্ক্রোনাস do_work() ফাংশনটি ব্লক করা হয়েছে এবং তার ফলাফল পেতে আমরা অপেক্ষা করছি।


Futures এবং Tasks-এর অ্যাসিঙ্ক্রোনাস কাজের মধ্যে পার্থক্য

  1. Futures: এটি একটি মান ধারণ করে যা পরবর্তীতে আসবে। এটি শুধু একবার কাজ করবে এবং পরে অন্য কোনো কাজের জন্য প্রতিক্রিয়া করবে।
  2. Tasks: এটি আসলে একটি রানিং ইউনিট, যা Future কে চালিয়ে একটি মানের জন্য অপেক্ষা করে এবং সেই মানে পৌঁছানোর পর কাজ শেষ হয়ে যায়।

Tokio এবং async-std

Rust-এ Futures এবং Tasks ব্যবস্থাপনা করার জন্য বেশ কিছু লাইব্রেরি রয়েছে, যার মধ্যে Tokio এবং async-std অন্যতম।

Tokio উদাহরণ:

Tokio হল Rust-এর একটি অ্যাসিঙ্ক্রোনাস রানটাইম যা ফিউচার এবং টাস্কগুলোকে ম্যানেজ করতে ব্যবহৃত হয়।

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

async fn greet() {
    println!("Hello from Tokio!");
}

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

এখানে, #[tokio::main] অ্যাট্রিবিউটটি ব্যবহৃত হয়েছে, যা অ্যাসিঙ্ক্রোনাস টাস্ক চালানোর জন্য tokio::runtime::Runtime ব্যবহার করে।


সারাংশ

Futures এবং Tasks Rust-এ অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের দুটি গুরুত্বপূর্ণ অংশ। Futures হল মান যা ভবিষ্যতে পাওয়া যাবে, এবং Tasks হল সেই অ্যাসিঙ্ক্রোনাস কাজ যা একটি Future তৈরি করে এবং তার উপর কাজ করে। async এবং await ব্যবহারের মাধ্যমে অ্যাসিঙ্ক্রোনাস কোড রান করা হয়, এবং block_on ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজগুলো সিঙ্ক্রোনাসভাবে সম্পন্ন করা যায়। Tokio এবং async-std হল প্রধান লাইব্রেরি যা Rust-এ Futures এবং Tasks পরিচালনার জন্য ব্যবহৃত হয়।

Content added By

Tokio এবং Async-Std হল Rust-এ asynchronous প্রোগ্রামিং এর জন্য জনপ্রিয় দুটি লাইব্রেরি। এই লাইব্রেরিগুলি non-blocking I/O, টাইমআউট, সাপোর্টেড ফিউচার এবং টাস্ক ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। এগুলি Rust-এ concurrency বা asynchronous অপারেশনগুলির জন্য অত্যন্ত গুরুত্বপূর্ণ টুল।

  • Tokio হল একটি asynchronous runtimes এবং I/O লাইব্রেরি যা highly performant অ্যাপ্লিকেশন তৈরির জন্য ব্যবহৃত হয়।
  • Async-Std একটি অপেক্ষাকৃত সোজা লাইব্রেরি যা asynchronous স্ট্যান্ডার্ড লাইব্রেরি API প্রদান করে।

Tokio লাইব্রেরি

Tokio হল একটি asynchronous runtimes লাইব্রেরি যা Rust-এ non-blocking অপারেশন সহজ করে তোলে এবং সিস্টেম রিসোর্স কার্যকরভাবে ব্যবহারের জন্য কার্যকরী। এটি asynchronous I/O, সিপিইউ-বাউন্ড টাস্ক এবং টাইমার ম্যানেজমেন্টের জন্য ব্যবহৃত হয়।

Tokio ইনস্টল করা

Cargo.toml ফাইলে Tokio ডিপেন্ডেন্সি যোগ করতে হবে:

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

এইভাবে, আপনি tokio লাইব্রেরির সমস্ত ফিচার সক্ষম করতে পারেন, যেমন TCP/UDP সাপোর্ট, timers, I/O সাপোর্ট ইত্যাদি।

Tokio-এর সাথে কাজ করা

use tokio::time::{sleep, Duration};

async fn say_hello() {
    println!("Hello, world!");
}

async fn main_task() {
    say_hello().await;
    sleep(Duration::from_secs(1)).await;
    println!("After 1 second");
}

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

এখানে, #[tokio::main] এট্রিবিউট ব্যবহার করা হয়েছে, যা main ফাংশনকে asynchronous করে তোলে। sleep() হল একটি asynchronous টাইমার যা ১ সেকেন্ডের জন্য ব্লক না করে নেক্সট অপারেশন চালাতে সাহায্য করে।


Async-Std লাইব্রেরি

Async-Std লাইব্রেরি একটি asynchronous Rust স্ট্যান্ডার্ড লাইব্রেরি, যা Rust-এ async কোড লেখার জন্য সহায়ক। এটি std লাইব্রেরির মতো API প্রদান করে, তবে asynchronous ফাংশনগুলো সমর্থন করে। Async-Std ইন্টারফেসের দিকে যতটা সম্ভব std লাইব্রেরির মতো থাকতে চেষ্টা করে।

Async-Std ইনস্টল করা

Cargo.toml ফাইলে Async-Std ডিপেন্ডেন্সি যোগ করতে হবে:

[dependencies]
async-std = "1.10"

Async-Std-এর সাথে কাজ করা

use async_std::task;
use async_std::prelude::*;
use std::time::Duration;

async fn say_hello() {
    println!("Hello, world!");
}

async fn main_task() {
    say_hello().await;
    task::sleep(Duration::from_secs(1)).await;
    println!("After 1 second");
}

fn main() {
    task::block_on(main_task());
}

এখানে, task::block_on() ব্যবহৃত হয়েছে যাতে asynchronous কোড সিঙ্ক্রোনাসভাবে রান করতে পারে। async_std::task::sleep একইভাবে tokio::sleep এর মতো async স্লিপ অপারেশন হিসাবে কাজ করে।


Tokio এবং Async-Std-এর মধ্যে পার্থক্য

ফিচারTokioAsync-Std
রানটাইমপুরোপুরি কাস্টমizable, বড় প্রকল্পের জন্য উপযুক্তসাধারণ রানটাইম যা async-std ফাংশন সরবরাহ করে
ফিচার সাপোর্টঅধিক সংখ্যক ফিচার, যেমন TCP/UDP সাপোর্ট, File I/O, timed I/Oকম ফিচার, তবে std লাইব্রেরির মতো API প্রদান করে
কার্যকারিতাবড় স্কেল এবং উচ্চ পারফরম্যান্স অ্যাপ্লিকেশনের জন্য উপযুক্তছোট স্কেল অ্যাপ্লিকেশন এবং সহজ কাজের জন্য উপযুক্ত
প্রজেক্টের ব্যাপ্তিউচ্চ কার্যকারিতা সহ বৃহৎ প্রকল্পের জন্য ব্যবহৃতছোট, হালকা প্রকল্পের জন্য উপযুক্ত

ব্যবহার ক্ষেত্র

  1. Tokio:
    • বড় আকারের, হাই পারফরম্যান্স ওয়েব সার্ভিস বা API গুলি তৈরির জন্য।
    • async I/O বা streaming ডেটা পরিচালনার জন্য।
    • উচ্চ লোডের সার্ভার নির্মাণে বা পাবলিক ক্লাউড ইন্সটলেশনগুলিতে ব্যবহৃত হয়।
  2. Async-Std:
    • ছোট এবং সাধারণ অ্যাপ্লিকেশনের জন্য উপযুক্ত যেখানে একাধিক concurrency টাস্ক ম্যানেজমেন্ট বা blocking I/O প্রয়োজন নেই।
    • ইন্টারেক্টিভ অ্যাপ্লিকেশন এবং স্ক্রিপ্টের জন্য ভালো।

সারাংশ

Tokio এবং Async-Std উভয়ই asynchronous কোড লেখার জন্য Rust-এ ব্যবহৃত হয়, তবে তাদের লক্ষ্য এবং স্কেল ভিন্ন। Tokio বৃহৎ, উচ্চ পারফরম্যান্স অ্যাপ্লিকেশনের জন্য উপযুক্ত, যেখানে Async-Std সাধারণত ছোট এবং সহজ অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়। দুটি লাইব্রেরি async/await সিঙ্ক্রোনাস স্টাইল ব্যবহারের মাধ্যমে Rust-এ non-blocking প্রোগ্রামিং সমর্থন করে।

Content added By

Concurrent programming হল এমন একটি প্রোগ্রামিং প্যাটার্ন যেখানে একাধিক কাজ একসাথে (অথবা সন্নিহিতভাবে) চলতে থাকে, তবে প্রতিটি কাজ একই সময়ে কার্যকর হতে পারে না। তবে, প্রতিটি কাজ স্বতন্ত্রভাবে একে অপরের সাথে সংযুক্ত থাকতে পারে।

Rust-এ কনকারেন্ট প্রোগ্রামিং মূলত Threads, Mutexes, এবং Channels এর মাধ্যমে পরিচালিত হয়। এটি সঠিকভাবে কাজ করার জন্য ownership, borrowing, এবং lifetime ব্যবস্থাপনা অত্যন্ত গুরুত্বপূর্ণ।

Threads ব্যবহার করে Concurrent Programs:

Rust-এর std::thread লাইব্রেরি দিয়ে সহজেই থ্রেড তৈরি করা যায়। নিচে একটি উদাহরণ দেওয়া হল:

use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        println!("Hello from a thread!");
    });

    // মেইন থ্রেডের কাজ শেষ হওয়ার আগে সাব-থ্রেড শেষ হওয়ার জন্য ওয়েট করা
    handle.join().unwrap();

    println!("Hello from main thread!");
}

এখানে thread::spawn একটি নতুন থ্রেড তৈরি করেছে, যা মূল থ্রেডের পাশাপাশি চলতে পারে। handle.join() কমান্ডটি মেইন থ্রেডে থ্রেডের শেষ হওয়ার জন্য ওয়েট করে।

Mutex এবং Channels ব্যবহার:

Mutex (Mutual Exclusion) একাধিক থ্রেডের মধ্যে শেয়ারড ডেটা অ্যাক্সেস সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয়। Channel ব্যবহার করে থ্রেডগুলির মধ্যে যোগাযোগ করা যায়।

Mutex উদাহরণ:

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));

    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap());
}

এখানে, Arc (Atomic Reference Counted) ব্যবহৃত হয়েছে যাতে Mutex শেয়ার করা ডেটা থ্রেডগুলির মধ্যে নিরাপদভাবে ভাগ করা যায়।


Asynchronous Programming in Rust

Asynchronous programming হল একটি পদ্ধতি যেখানে কাজগুলো একসাথে শুরু হয়, কিন্তু প্রতিটি কাজ একে অপরের সাথে ব্লক না হয়ে অপেক্ষা করতে পারে। Rust-এ async/await প্যাটার্ন ব্যবহৃত হয়, যা async ফাংশন বা ব্লক তৈরি করে এবং await দিয়ে অন্য asynchronous কোডের জন্য অপেক্ষা করা হয়।

Asynchronous Functions ব্যবহার করা:

Rust-এ asynchronous কাজ করতে সাধারণত tokio বা async-std এর মতো লাইব্রেরি ব্যবহার করা হয়। এখানে tokio ব্যবহার করার উদাহরণ দেওয়া হল।

# Cargo.toml
[dependencies]
tokio = { version = "1", features = ["full"] }
use tokio;

#[tokio::main]
async fn main() {
    let task1 = tokio::spawn(async {
        println!("Task 1 is running");
    });

    let task2 = tokio::spawn(async {
        println!("Task 2 is running");
    });

    let _ = tokio::join!(task1, task2);
    println!("All tasks completed");
}

এখানে, #[tokio::main] অ্যাট্রিবিউট দিয়ে async রানটাইম চালানো হচ্ছে, এবং tokio::spawn ব্যবহৃত হয়েছে দুটি অ্যাসিঙ্ক্রোনাস টাস্ক তৈরি করতে। tokio::join! কমান্ডটি দুটি অ্যাসিঙ্ক্রোনাস টাস্ক একসাথে চালানোর জন্য ব্যবহৃত হয়েছে।

Asynchronous File I/O:

Rust-এ অ্যাসিঙ্ক্রোনাস ফাইল অপারেশন করা সম্ভব tokio লাইব্রেরির মাধ্যমে:

use tokio::fs::File;
use tokio::io::AsyncReadExt;

#[tokio::main]
async fn main() {
    let mut file = File::open("hello.txt").await.unwrap();
    let mut contents = String::new();
    file.read_to_string(&mut contents).await.unwrap();
    println!("File contents: {}", contents);
}

এখানে, File::open এবং read_to_string ফাংশনগুলি await দিয়ে ব্যবহার করা হয়েছে, যা অ্যাসিঙ্ক্রোনাস ফাইল রিডিং সক্ষম করেছে।


Asynchronous Programming এর সুবিধা

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

Concurrency এবং Asynchronous Programming এর মধ্যে পার্থক্য

  1. Concurrency: একাধিক কাজ একসাথে রান করার প্রক্রিয়া, কিন্তু এই কাজগুলি একে অপরকে ব্লক না করে সম্পন্ন হতে পারে। এটি বিভিন্ন থ্রেড বা প্রক্রিয়া ব্যবহার করে।
  2. Asynchronous: এটি এমন একটি পদ্ধতি, যেখানে একটি কাজ একে অপরকে ব্লক না করে, তবে কিছু সময় অপেক্ষা করে অন্য কাজগুলি সম্পন্ন হওয়ার জন্য। অ্যাসিঙ্ক্রোনাস কোড এক থ্রেডে রান করতে পারে, যা খুব কম মেমোরি ব্যবহার করে এবং দক্ষ হতে পারে।

সারাংশ

Rust-এ concurrent এবং asynchronous প্রোগ্রামিং কার্যকরভাবে কোডের পারফরম্যান্স বৃদ্ধি করতে এবং মেমোরি ব্যবহারের দক্ষতা বাড়াতে ব্যবহৃত হয়। Threads এবং Mutexes ব্যবহার করে কনকারেন্ট প্রোগ্রাম তৈরি করা সম্ভব, এবং async/await প্যাটার্ন এবং tokio লাইব্রেরি ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রোগ্রাম তৈরি করা যায়। Rust-এ এই প্যাটার্নগুলি ব্যবহার করে আপনি দ্রুত, স্কেলেবল এবং দক্ষ অ্যাপ্লিকেশন তৈরি করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...