Streams এবং Futures এর সাথে কাজ করা

Streams এবং Futures (স্ট্রিমস এবং ফিউচারস) - স্কালা কালেকশন (Scala Collections) - Computer Programming

267

স্কালাতে স্ট্রিমস (Streams) এবং ফিউচারস (Futures) দুটি অত্যন্ত শক্তিশালী টুল যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং এবং ডেটা প্রবাহের (data flow) জন্য ব্যবহৃত হয়। এগুলি কার্যকরভাবে দীর্ঘ-running বা বিলম্বিত অপারেশন পরিচালনা করতে সহায়ক, যেমন নেটওয়ার্ক কল, ডাটাবেস কুয়েরি, বা প্যারালাল প্রসেসিং। নিচে স্কালাতে স্ট্রিমস এবং ফিউচারস এর সাথে কাজ করার পদ্ধতি ব্যাখ্যা করা হয়েছে।


স্ট্রিমস (Streams)

স্ট্রিমস হল একটি সিকোয়েন্স (sequences) যার মাধ্যমে আপনি ডেটা প্রক্রিয়া (process) করতে পারেন এক্সপ্রেশন হিসেবে, বিশেষত ফাংশনাল প্রোগ্রামিং কৌশল ব্যবহার করে। স্কালাতে Stream এমন একটি কালেকশন টাইপ যা লেজি (lazy) ইভ্যালুয়েশন ব্যবহার করে, অর্থাৎ ডেটা তখনই প্রক্রিয়া করা হয় যখন প্রয়োজন হয়। এটি কার্যকরীভাবে বৃহৎ ডেটাসেট এবং ট্রান্সফর্মেশনের ক্ষেত্রে সহায়ক।

স্ট্রিমস এর মূল ধারণা:

  • Lazy Evaluation: স্ট্রিমস তখনই মান প্রদান করে যখন তাদের প্রয়োজন হয়। এটি কার্যকরী বড় ডেটাসেটের জন্য।
  • Infinite Stream: স্ট্রিমস অনন্ত হতে পারে এবং আপনি প্রয়োজনে এগুলিকে সীমিত করতে পারেন, যেমন প্রথম ১০টি উপাদান।

স্ট্রিমস এর উদাহরণ:

// একটি ইনফিনিট স্ট্রিম তৈরি করা
val infiniteStream: Stream[Int] = Stream.from(1)

// প্রথম 10টি উপাদান নিন
val first10 = infiniteStream.take(10)

println(first10.toList)  // List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

এখানে, Stream.from(1) একটি ইনফিনিট স্ট্রিম তৈরি করছে, কিন্তু take(10) মেথডটি প্রথম ১০টি উপাদান ফেরত দিচ্ছে।

স্ট্রিমস এর ফাংশনাল অপারেশনস:

স্কালাতে, স্ট্রিমস map, filter, flatMap এর মতো অপারেশন সমর্থন করে, যা ফাংশনাল প্রোগ্রামিংয়ের আদর্শ।

val numbers = Stream(1, 2, 3, 4, 5)

// map অপারেশন প্রয়োগ করে প্রতিটি উপাদান দ্বিগুণ করা
val doubled = numbers.map(x => x * 2)
println(doubled.toList)  // List(2, 4, 6, 8, 10)

এখানে, map মেথডটি প্রতিটি উপাদানকে দ্বিগুণ করে এবং রেজাল্ট হিসেবে একটি নতুন স্ট্রিম তৈরি হয়।


ফিউচারস (Futures)

ফিউচারস স্কালাতে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়। এটি একটি অপারেশনকে অ্যাসিঙ্ক্রোনাসভাবে (অর্থাৎ, সিঙ্ক্রোনাস অপারেশন ব্লক না করে) সম্পাদন করতে সহায়ক। সাধারণত, এটি দীর্ঘ-running অপারেশন যেমন নেটওয়ার্ক কল, ফাইল সিস্টেম অ্যাক্সেস, বা ডাটাবেস অপারেশন পরিচালনা করতে ব্যবহৃত হয়।

ফিউচারস এর মূল ধারণা:

  • Async Programming: ফিউচারস অ্যাসিঙ্ক্রোনাস অপারেশন সম্পাদন করার জন্য ব্যবহৃত হয় এবং আপনি অপারেশনটির ফলাফল পাওয়ার জন্য অপেক্ষা করতে পারেন, এটি non-blocking ভাবে কাজ করে।
  • ExecutionContext: স্কালাতে, ফিউচারস ব্যবহারের জন্য একটি ExecutionContext প্রয়োজন, যা থ্রেড পুল পরিচালনা করে।

ফিউচারস এর উদাহরণ:

import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util._

val future = Future {
  // কিছু দীর্ঘ-running কাজ
  Thread.sleep(2000)
  42
}

future.onComplete {
  case Success(result) => println(s"Result: $result")
  case Failure(exception) => println(s"Error: $exception")
}

println("Waiting for the result...")

এখানে, Future একটি অ্যাসিঙ্ক্রোনাস অপারেশন তৈরি করছে যা ২ সেকেন্ড পর 42 রিটার্ন করবে। onComplete মেথডটি ফিউচারের ফলাফল প্রাপ্তির পর কলব্যাক হিসেবে কাজ করে।

ফিউচারস এবং স্ট্রিমস একত্রিত করা:

ফিউচারস এবং স্ট্রিমস একত্রিত করা সম্ভব এবং এটি একটি প্রক্রিয়া বা ডেটা প্রবাহকে অ্যাসিঙ্ক্রোনাসভাবে প্রক্রিয়া করতে সাহায্য করে।

val futureStream: Future[Stream[Int]] = Future {
  // কিছু দীর্ঘ-running কাজের মাধ্যমে স্ট্রিম তৈরি করা
  Stream.from(1).take(5).toList
}

futureStream.onComplete {
  case Success(result) => println(s"Future Stream Result: $result")
  case Failure(exception) => println(s"Error: $exception")
}

এখানে, একটি ফিউচার তৈরি হচ্ছে যা একটি স্ট্রিম তৈরি করবে এবং তারপরে সেই স্ট্রিমের উপর কাজ করা হবে।


স্ট্রিমস এবং ফিউচারস এর মধ্যে সংযোগ

  1. অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং:
    স্ট্রিমস এবং ফিউচারস উভয়ই অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং ধারণা সমর্থন করে, তবে তাদের ব্যবহার আলাদা। স্ট্রিমস সাধারণত ডেটা প্রবাহের প্রক্রিয়ায় কাজে আসে, এবং ফিউচারস নির্দিষ্ট অ্যাসিঙ্ক্রোনাস কাজের জন্য ব্যবহৃত হয়।
  2. ডেটা প্রক্রিয়া:
    আপনি যদি স্ট্রিমে লম্বা-running কাজ পরিচালনা করতে চান (যেমন API কল বা দীর্ঘ ডেটা প্রসেসিং), তবে আপনি ফিউচারস এর মাধ্যমে তা অ্যাসিঙ্ক্রোনাসভাবে করতে পারেন, এবং এরপর স্ট্রিমের মাধ্যমে ডেটা প্রবাহের উপর কাজ করতে পারেন।

সারাংশ

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

Content added By
Promotion

Are you sure to start over?

Loading...