Concurrency হল একাধিক কাজ বা থ্রেড একসাথে একযোগভাবে কাজ করার প্রক্রিয়া, যা মাল্টি-প্রসেসিং এবং মাল্টি-থ্রেডিংয়ের মাধ্যমে সম্ভব। জুলিয়া ভাষা concurrency বা parallelism এর জন্য শক্তিশালী এবং নমনীয় সমাধান প্রদান করে, যা উচ্চ কর্মক্ষমতা সম্পন্ন গণনা ও বিশ্লেষণকে সহজতর করে।
জুলিয়া ভাষায় concurrency একাধিক কাজকে একত্রে কার্যকর করার জন্য বিভিন্ন কৌশল ব্যবহৃত হয়, যেমন tasks, threads, এবং shared memory মডেল। জুলিয়া multithreading, asynchronous programming এবং parallel computing সমর্থন করে, যা সিপিইউ কোরের সঠিক ব্যবহার নিশ্চিত করতে সাহায্য করে।
১. টাস্ক এবং থ্রেড (Tasks and Threads)
জুলিয়া concurrency এর জন্য tasks এবং threads ব্যবহার করে। Tasks হল অল্প সময়ের জন্য ব্যাকগ্রাউন্ডে চলমান কাজ, যেগুলি অন্যান্য কাজের সাথে একযোগে চলতে পারে।
Tasks (জুলিয়া এর asyncronous tasks)
Tasks হলো এক ধরনের কোড যা কোডের মূল প্রবাহের বাইরে চলতে পারে এবং সেগুলি @async কিওয়ার্ড দিয়ে চালানো হয়। @async কোডের execution এর সময় বিভিন্ন কাজ একে অপরের সাথে concurrently চলতে দেয়।
function task1()
println("Task 1 started")
sleep(2)
println("Task 1 completed")
end
function task2()
println("Task 2 started")
sleep(1)
println("Task 2 completed")
end
# Run both tasks concurrently
@async task1()
@async task2()এখানে, task1() এবং task2() দুটি কাজ @async এর মাধ্যমে একযোগে চলবে। sleep() ফাংশন এখানে একটি বিলম্ব তৈরি করে, এবং দুটি টাস্ক আলাদাভাবে সময় নিয়ে সম্পন্ন হবে, তবে একটি অন্যটির জন্য অপেক্ষা করবে না।
Threads (জুলিয়া এর multithreading)
জুলিয়া Threads এর মাধ্যমে মাল্টি-থ্রেডিং সমর্থন করে, যেখানে একাধিক থ্রেডের মধ্যে কাজ বিভক্ত করা হয়। একটি Thread হল একটি হালকা একক প্রক্রিয়া যা প্যারালাল কাজ করতে পারে। জুলিয়া Threads.@spawn ব্যবহার করে একাধিক থ্রেডে কোড এক্সিকিউট করতে সাহায্য করে।
using Base.Threads
function parallel_task(i)
println("Thread $i is starting")
sleep(2)
println("Thread $i is done")
end
# Run multiple threads concurrently
n_threads = 4
for i in 1:n_threads
@spawn parallel_task(i)
endএখানে, @spawn একটি নতুন থ্রেড তৈরি করে এবং parallel_task(i) ফাংশনকে বিভিন্ন থ্রেডে চালানোর জন্য ব্যবহার করা হয়। প্রতিটি থ্রেড একটি আলাদা কাজ করবে এবং sleep() ফাংশনটি ব্যবহার করার মাধ্যমে সময় নেবে।
২. চ্যানেল (Channels)
Channels একটি অত্যন্ত গুরুত্বপূর্ণ কনসেপ্ট জুলিয়া ভাষায় Concurrency পরিচালনার জন্য। চ্যানেলগুলি এড্রেস স্পেস এর মধ্যে ডেটা পাঠানোর জন্য ব্যবহৃত হয় এবং message passing বা task synchronization এর জন্য ব্যবহার করা হয়।
চ্যানেল উদাহরণ
function producer(ch)
for i in 1:5
println("Produced: ", i)
put!(ch, i)
sleep(1)
end
close(ch)
end
function consumer(ch)
for i in 1:5
item = take!(ch)
println("Consumed: ", item)
end
end
# Create a channel with a buffer size of 5
ch = Channel{Int}(5)
# Run producer and consumer concurrently
@async producer(ch)
@async consumer(ch)এখানে, producer ফাংশন ডেটা তৈরি করে এবং consumer ফাংশন সেই ডেটা গ্রহণ করে। Channel{Int}(5) একটি চ্যানেল তৈরি করে যা ৫টি মান ধারণ করতে পারে। put! চ্যানেলে ডেটা পাঠায় এবং take! চ্যানেল থেকে ডেটা গ্রহণ করে।
৩. মিউটেক্স (Mutex) এবং রিডার/রাইটার লক (Reader/Writer Locks)
Mutex এবং Reader/Writer Locks জুলিয়া ভাষায় shared memory এর মধ্যে একাধিক থ্রেডের মধ্যে data race (ডেটা প্রতিযোগিতা) রোধ করার জন্য ব্যবহৃত হয়।
- Mutex (Mutual Exclusion) একটি কোড ব্লককে শুধুমাত্র এক থ্রেডের জন্য অনুমতি দেয়।
- Reader/Writer Locks ব্যবহার করা হয় যখন কিছু থ্রেড শুধুমাত্র পড়তে পারে, এবং কিছু থ্রেড লিখতে পারে।
Mutex উদাহরণ
lock = ReentrantLock() # Create a mutex lock
function critical_section()
lock(lock) # Acquire the lock
println("Inside critical section")
sleep(1)
unlock(lock) # Release the lock
end
# Run two tasks with mutex
@async critical_section()
@async critical_section()এখানে lock() এবং unlock() ব্যবহার করা হয়েছে একটি critical_section এর নিরাপত্তা নিশ্চিত করতে, যাতে এক সময়ে শুধুমাত্র একটি থ্রেডই সেই কোড ব্লক এক্সিকিউট করতে পারে।
৪. আসিঙ্ক্রোনাস প্রোগ্রামিং (Asynchronous Programming)
জুলিয়া asynchronous programming সমর্থন করে, যেখানে কোড একে একে চলে না, বরং একাধিক কোড একযোগে বা প্যারালালভাবে চলে। @async এবং @wait কিওয়ার্ড ব্যবহার করে আপনি আসিঙ্ক্রোনাস কাজ পরিচালনা করতে পারেন।
Asynchronous উদাহরণ
function async_task(id)
println("Task $id started")
sleep(2)
println("Task $id completed")
end
@async async_task(1)
@async async_task(2)
# Wait for all async tasks to finish
@async async_task(3)
@waitএখানে, @async কিওয়ার্ডটি কাজটি আসিঙ্ক্রোনাসভাবে চালু করে এবং @wait সমস্ত আসিঙ্ক্রোনাস কাজের জন্য অপেক্ষা করে।
৫. প্যারালাল কম্পিউটিং (Parallel Computing)
জুলিয়া parallel computing সমর্থন করে, যার মাধ্যমে একাধিক প্রসেসকে একযোগভাবে পরিচালনা করা যায়। এটি @distributed কিওয়ার্ড বা @everywhere কিওয়ার্ডের মাধ্যমে করা হয়।
প্যারালাল কম্পিউটিং উদাহরণ
using Distributed
@everywhere function f(x)
return x^2
end
@everywhere begin
addprocs(2) # Add 2 worker processes
results = pmap(f, 1:10)
println(results)
endএখানে, @everywhere এবং pmap ব্যবহার করে একাধিক প্রসেসে কোড এক্সিকিউট করা হয়েছে।
সারসংক্ষেপ
জুলিয়া ভাষায় Concurrency মডেল অত্যন্ত শক্তিশালী এবং নমনীয়, যা multithreading, asynchronous programming, tasks, channels, mutex, reader/writer locks, এবং parallel computing এর মাধ্যমে কাজ করে। এটি উচ্চ কর্মক্ষমতার কাজগুলির জন্য আদর্শ এবং ডেটা বিশ্লেষণ, সিমুলেশন এবং গণনার জন্য কার্যকর। @async, @spawn, @everywhere, এবং @distributed কিওয়ার্ডগুলির মাধ্যমে একাধিক থ্রেড এবং প্রসেস পরিচালনা করা সম্ভব, যা কোডকে দ্রুত এবং কার্যকরী করে তোলে।
Read more