স্কালায় ফিউচার (Future) এবং প্রমিস (Promise) দুটি এমন ডাটা টাইপ যা এ্যাসিনক্রোনাস প্রোগ্রামিং (Asynchronous Programming) করতে ব্যবহৃত হয়। এই দুটি টুল আপনাকে বহু প্রসেসের মধ্যে সমন্বয় করার সুযোগ দেয়, যখন কোনো প্রসেস বা কাজ চলমান থাকে এবং আপনি সেগুলির ফলাফল ভবিষ্যতে পেতে চান।
১. ফিউচার (Future)
Future স্কালায় একটি অবজেক্ট যা কোনও কাজের ফলাফল ভবিষ্যতে পাওয়া যাবে এমন একটি ধারণা তৈরি করে। এটি স্কালার concurrent লাইব্রেরির একটি অংশ এবং অ্যাসিনক্রোনাস (asynchronous) প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়।
ফিউচার মূলত একটি লেট (lazy) কম্পিউটেশন যা যে কোনো সময় অবশেষে ফলাফল প্রদান করবে। এটি পরবর্তীতে মান বা ত্রুটি রিটার্ন করতে পারে, যার মাধ্যমে আপনি অ্যাসিনক্রোনাস কাজ পরিচালনা করতে পারবেন।
ফিউচারের গঠন:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val future: Future[Int] = Future {
// কোন কিছু কাজ হচ্ছে, যেমন সময় নেওয়া কাজ
5 + 5
}এখানে:
Futureহ'ল একটি অবজেক্ট যা একটি অস্বাভাবিক কাজের ফলাফল ফিরে পেতে সাহায্য করে।ExecutionContext.Implicits.global: এটি স্কালায় ফিউচার চালানোর জন্য ব্যবহৃত এক্সিকিউশন কন্টেক্সট।Futureব্লকের ভিতরে যে কোডটি রয়েছে, তা অ্যাসিনক্রোনাসভাবে এক্সিকিউট হয়।
ফিউচার থেকে মান পাওয়া:
ফিউচার যদি সফলভাবে সম্পন্ন হয়, তবে তার মান বা ফলাফল পাওয়ার জন্য onComplete, map, flatMap ইত্যাদি মেথড ব্যবহার করা হয়।
উদাহরণ:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val future: Future[Int] = Future {
// যেকোনো সময় কাজ করবে
5 + 5
}
future.onComplete {
case Success(value) => println(s"Future completed successfully with result: $value")
case Failure(exception) => println(s"Future failed with exception: $exception")
}এখানে:
onCompleteমেথড ব্যবহার করে ফিউচারটির ফলাফল হ্যান্ডল করা হয়েছে, যা ফিউচারটি সফল হলেSuccessএবং ত্রুটি হলেFailureব্লকে চলে।
ফিউচার মেথড:
map: ফিউচারের মানটি সফলভাবে পাওয়ার পর একটি নতুন মান রিটার্ন করে।flatMap:mapএর মতো, তবে এটি একটি ফিউচার রিটার্ন করে।
val result = future.map(value => value * 2)২. প্রমিস (Promise)
Promise একটি mutable ডাটা টাইপ যা Future এর সাথে সম্পর্কিত, তবে এটি ফিউচারের মানটি স্থিরভাবে সেট করার জন্য ব্যবহৃত হয়। একদিকে, Future শুধুমাত্র একটি ফলাফল বা ত্রুটির জন্য অপেক্ষা করে, অন্যদিকে Promise এটি সেট করতে পারে এবং Future তে ফলাফল প্রেরণ করতে পারে।
প্রমিসের গঠন:
import scala.concurrent.Promise
import scala.concurrent.Future
val promise = Promise[Int]()
val future: Future[Int] = promise.future
// Promise এর মান সেট করা
promise.success(42)এখানে:
Promise[Int]একটি প্রমিস তৈরি করা হয়েছে যা পরে একটিIntরিটার্ন করবে।promise.futureএকটিFutureরিটার্ন করে, যা ভবিষ্যতে একটি মান বা ত্রুটি ধারণ করবে।
প্রমিস থেকে মান সেট করা:
আপনি success বা failure মেথড ব্যবহার করে প্রমিসের মান সেট করতে পারেন।
val promise = Promise[Int]()
// প্রমিসে মান সেট করা
promise.success(100) // মান সফলভাবে সেট করা
// promise.failure(new Exception("Something went wrong")) // ত্রুটি সেট করাএখানে:
successমেথড ব্যবহার করে একটি সফল মান প্রেরণ করা হয়।failureমেথড ব্যবহার করে ত্রুটি প্রেরণ করা হয়।
প্রমিসের ব্যবহার:
প্রমিসকে Future এর মান প্রেরণের জন্য এবং অ্যাসিনক্রোনাস প্রোগ্রামিংয়ে ফলাফল প্রেরণের জন্য ব্যবহার করা হয়। এটি মূলত ব্যাকএন্ড সার্ভিসে বা থ্রেডিং অপারেশনে ব্যবহৃত হয়।
উদাহরণ:
import scala.concurrent.{Promise, Future}
import scala.concurrent.ExecutionContext.Implicits.global
val promise = Promise[String]()
val future: Future[String] = promise.future
// ৫ সেকেন্ড পর প্রমিসে মান সেট করা
Future {
Thread.sleep(5000)
promise.success("Completed!")
}
future.onComplete {
case Success(value) => println(value) // Output: Completed!
case Failure(exception) => println(s"Failed with exception: $exception")
}এখানে:
- ৫ সেকেন্ড পর
promise.success("Completed!")দ্বারা প্রমিসের মান সেট করা হচ্ছে, এবং পরেfutureসেই মান প্রাপ্ত করে প্রিন্ট করছে।
৩. ফিউচার এবং প্রমিসের মধ্যে পার্থক্য
| বৈশিষ্ট্য | ফিউচার (Future) | প্রমিস (Promise) |
|---|---|---|
| মিউটেবল বা ইমিউটেবল | ইমিউটেবল (Immutable) | মিউটেবল (Mutable) |
| মানের প্রেরণ | ভবিষ্যতে একটি মান প্রাপ্তির জন্য অপেক্ষা করে | মান বা ত্রুটি সরাসরি প্রেরণ করা যায় |
| পাবলিশার এবং সাবস্ক্রাইবার | শুধুমাত্র সাবস্ক্রাইবার হিসাবে ব্যবহৃত | পাবলিশার হিসেবে ব্যবহৃত (ফিউচার মান সেট করার জন্য) |
| প্রসেসিং | কোনো নির্দিষ্ট প্রসেস বা ক্যালকুলেশন সম্পন্ন হতে পারে | প্রমিস মানে, একটি অপারেশন সরাসরি সম্পন্ন করার ক্ষমতা |
| ইউজ | ফলাফল বা ত্রুটি অ্যাসিনক্রোনাসভাবে হ্যান্ডলিং করার জন্য | ফলাফল সরাসরি প্রেরণ এবং ফিউচার তৈরি করার জন্য |
সারাংশ
Futureস্কালায় একটি ইমিউটেবল ডাটা টাইপ যা কোনো অ্যাসিনক্রোনাস কাজের ফলাফল রিটার্ন করে। এটি একটি স্থিতিশীল মান বা ত্রুটি প্রাপ্তির জন্য অপেক্ষা করে।Promiseএকটি মিউটেবল ডাটা টাইপ যা ফিউচার তৈরি করতে ব্যবহৃত হয় এবং এর মান success বা failure মেথড ব্যবহার করে সেট করা হয়।
এই দুটি বৈশিষ্ট্য আপনাকে অ্যাসিনক্রোনাস প্রোগ্রামিং এবং কনকারেন্ট (concurrent) কাজের জন্য সাহায্য করে, যেখানে ফলাফল কখনও দ্রুত এবং কখনও একটু সময় নেয়।
Read more