Haskell এ Async এবং Parallel Computation
Haskell একটি purely functional programming language, যেখানে side effects থাকে না এবং immutable ডেটার উপরে কাজ করা হয়। তবে, বাস্তব জীবনের প্রোগ্রামিংয়ের মধ্যে প্রায়শই concurrent এবং parallel কার্যক্রমের প্রয়োজন হয়। Haskell এর মধ্যে Async এবং Parallel computation প্রোগ্রামিংয়ের শক্তিশালী সুবিধা প্রদান করে, যা ডেটা প্রক্রিয়াকরণ বা গণনা দ্রুততর এবং আরও কার্যকরী করে তোলে। এখানে Async এবং Parallel computation এর মূল ধারণা, তাদের মধ্যে পার্থক্য এবং Haskell এ এর ব্যবহার তুলে ধরা হবে।
১. Async Computation (অ্যাসিঙ্ক্রোনাস গণনা)
Async বা Asynchronous computation এমন একটি প্রোগ্রামিং প্যাটার্ন, যেখানে একাধিক কাজ একে অপরের সাথে সমান্তরালভাবে (concurrently) চালানো হয়, কিন্তু এক কাজের ফলাফল পাওয়ার জন্য অন্য কাজের জন্য অপেক্ষা করা হয় না। অর্থাৎ, এক কাজ সম্পন্ন হতে না-হতেই অন্যান্য কাজ চলতে থাকে।
Haskell এ Async computation পরিচালনা করতে async এবং wait ফাংশন ব্যবহার করা হয়, যেগুলি Control.Concurrent.Async মডিউলে থাকে। এটি concurrent কার্যকলাপ সম্পাদন করতে ব্যবহৃত হয়, যার মাধ্যমে একাধিক কাজ বা থ্রেড একে অপরের সাথে চলতে পারে, কিন্তু থ্রেড একে অপরের কাজের জন্য অপেক্ষা করে না।
উদাহরণ: Async Computation
import Control.Concurrent.Async
asyncExample :: IO ()
asyncExample = do
async1 <- async (putStrLn "Task 1")
async2 <- async (putStrLn "Task 2")
wait async1
wait async2এখানে, async ফাংশন দুটি থ্রেডে দুটি কাজ শুরু করে: একটি "Task 1" এবং অন্যটি "Task 2"। wait ফাংশনটি একটি কাজের সমাপ্তি পর্যন্ত অপেক্ষা করে।
ব্যবহৃত:
Prelude> asyncExample
Task 1
Task 2এখানে, দুটি কাজ একযোগে (concurrently) চলছে এবং wait ব্যবহার করে আমরা তাদের ফলাফল পেয়েছি।
২. Parallel Computation (প্যারালাল গণনা)
Parallel computation হল একাধিক কাজ একই সময়ে, বিভিন্ন প্রসেসরে বা কোরে চলতে থাকে। Parallel computation কেবলমাত্র তখন কার্যকরী, যখন একাধিক প্রসেসর বা কোরের ব্যবহার করা সম্ভব হয়, অর্থাৎ হ্যাস্কেলের প্রোগ্রামগুলি একাধিক CPU কোরে কার্যকরভাবে চলতে পারে। এর মাধ্যমে, কাজের গতি অনেক দ্রুত হয়।
Haskell এ parallel computation করতে par এবং pseq ফাংশনগুলো ব্যবহার করা হয়, যেগুলি Control.Parallel মডিউলে পাওয়া যায়।
উদাহরণ: Parallel Computation
import Control.Parallel
parallelExample :: Int -> Int -> Int
parallelExample x y = (x `par` (y `par` (x + y))) `pseq` (x + y)এখানে, par একটি কাজকে parallelly নির্ধারণ করে এবং pseq পরবর্তী কাজকে অনুসরণ করতে বলে। এটি নিশ্চিত করে যে দুইটি কাজ একই সময়ে চালানো হচ্ছে।
ব্যবহৃত:
Prelude> parallelExample 1 2
3এখানে, দুটি কাজের মধ্যে parallel execution নিশ্চিত করা হয়েছে এবং আউটপুট পাওয়া গেছে।
৩. Async vs Parallel
| Property | Async | Parallel |
|---|---|---|
| Execution Style | Concurrent (তথ্য একসাথে চলছে, কিন্তু একে অপরের ফলাফলের জন্য অপেক্ষা না করে) | True parallelism (একই সময়ে একাধিক কোরে কাজ হচ্ছে) |
| Concurrency | Concurrent (একাধিক কাজ একে অপরের সাথে চলে) | Parallel (একাধিক কাজ একযোগে CPU কোরে চলে) |
| Synchronization | async এবং wait দিয়ে কাজ সমন্বিত করা হয় | par এবং pseq দিয়ে সমান্তরাল কাজের সমন্বয় |
| Use Case | ব্যবহার করা হয় যখন কাজের মধ্যে নির্দিষ্ট ধরণের প্রেক্ষিত থাকে, যেমন ব্যাকগ্রাউন্ড কাজ | ব্যবহার করা হয় যখন একাধিক প্রসেসর বা কোরের ক্ষমতা ব্যবহার করতে হয়, যেমন গণনা বা ডেটা প্রসেসিং |
- Async ব্যবহৃত হয় এমন কাজগুলির জন্য, যেখানে একাধিক কাজ একে অপরের সাথে সমান্তরালভাবে চলতে পারে, কিন্তু তাদের ফলাফল একে অপরের জন্য অপেক্ষা করে না।
- Parallel ব্যবহৃত হয় যখন একাধিক কাজ একযোগে (সত্যিকারের) পারস্পরিক কোরে চালাতে হয় এবং কাজগুলি একে অপরের পরিপূরক।
৪. Haskell এ Concurrent ও Parallel Programming এর সুবিধা
- প্রচুর CPU কোর ব্যবহার:
Parallel programming একাধিক কোর ব্যবহার করে কম্পিউটেশনের গতি বৃদ্ধি করে। Haskell এparওpseqএর মাধ্যমে আপনি একাধিক CPU কোরকে কাজে লাগাতে পারেন। - এফিসিয়েন্সি:
Async এবং Parallel অপারেশনগুলির মাধ্যমে Haskell প্রোগ্রামগুলি দ্রুত এবং দক্ষভাবে কাজ করতে পারে, বিশেষত যখন কাজগুলি বড় ডেটাসেট বা দীর্ঘ সময়সীমার প্রয়োজন হয়। - এনার্জি দক্ষতা:
একাধিক কোর ব্যবহার করা এবং কাজগুলোকে সমান্তরালে চালানো energy efficiency বৃদ্ধিতে সাহায্য করে, কারণ এটি CPU কোরগুলির মধ্যে ভারসাম্য বজায় রাখে। - সহজ কোডিং:
Haskell এরasyncএবংparমডিউলগুলি কোডকে সহজে ব্যবস্থাপনাযোগ্য করে তোলে এবং একাধিক কাজের মধ্যে সমন্বয় সাধন করা সহজ হয়।
৫. Conclusion
Haskell এ Async এবং Parallel computation ব্যবহার করা একটি শক্তিশালী উপায়, যা কোডের কার্যক্ষমতা বৃদ্ধি করতে সাহায্য করে, বিশেষত যখন একাধিক কাজ সমান্তরালে বা একযোগে চলতে পারে। Async computation আপনার কোডে concurrency নিয়ে আসে এবং Parallel computation আপনার ডেটা প্রসেসিং এবং গণনার গতি বাড়ায়। Haskell এর IO Monad এবং Control.Concurrent.Async মডিউল ব্যবহার করে আপনি খুব সহজে async এবং parallel computation বাস্তবায়ন করতে পারেন, যা আপনাকে কার্যকরী এবং দ্রুত প্রোগ্রাম তৈরি করতে সহায়ক হবে।
Read more