মাল্টিথ্রেডিং এবং কনকারেন্সি হলো প্রোগ্রামিংয়ের দুটি গুরুত্বপূর্ণ ধারণা, যা কোডের পারফরম্যান্স উন্নত করতে এবং একাধিক কাজ একইসাথে সম্পাদন করতে সহায়ক। পাইথনে মাল্টিথ্রেডিং এবং কনকারেন্সি ব্যবহার করে প্রোগ্রামের একাধিক অংশ বা ফাংশন একই সাথে চালানো যায়, যা সময় এবং রিসোর্সের সঠিক ব্যবহার নিশ্চিত করে।
মাল্টিথ্রেডিং (Multithreading)
মাল্টিথ্রেডিং হলো একটি প্রক্রিয়া যেখানে একটি প্রোগ্রাম একই সময়ে একাধিক থ্রেড চালাতে পারে। একটি থ্রেড হলো প্রোগ্রামের একটি ছোট ইউনিট, যা স্বতন্ত্রভাবে কাজ করতে পারে। মাল্টিথ্রেডিং সাধারণত আই/ও-ভিত্তিক কাজের জন্য খুবই উপযোগী, কারণ এটি CPU রিসোর্সের অপেক্ষা না করে অন্যান্য কাজ চালাতে দেয়।
মাল্টিথ্রেডিং উদাহরণ
import threading
import time
# একটি সাধারণ ফাংশন যা একটি নির্দিষ্ট সময়ের জন্য ঘুমায়
def print_numbers():
for i in range(1, 6):
print(f"Number: {i}")
time.sleep(1)
# থ্রেড তৈরি এবং শুরু করা
thread = threading.Thread(target=print_numbers)
thread.start()
# থ্রেডটি অন্য কাজের সাথে একই সাথে চলবে
print("This will print while the thread is running.")
থ্রেড ব্যবহার করার সুবিধা
- একাধিক কাজ এক সাথে করতে সক্ষম
- আই/ও-বাউন্ড কাজের পারফরম্যান্স উন্নত করে
- দ্রুত রেসপন্সের জন্য কার্যকরী
থ্রেড ব্যবহার করার সমস্যা
- থ্রেডের মধ্যে ডেটা শেয়ার করা জটিল এবং ডেটা কনসিস্টেন্সি নিশ্চিত করা কঠিন
- ডেডলক (Deadlock) এবং রেস কন্ডিশনের (Race Condition) মত সমস্যা হতে পারে
কনকারেন্সি (Concurrency)
কনকারেন্সি হলো একই সময়ে একাধিক কাজ সম্পন্ন করার ধারণা। এটি একাধিক কাজের মধ্যে দ্রুত স্যুইচিং করে কাজ করে। কনকারেন্সি সাধারণত মাল্টিপ্রসেসিং বা মাল্টিথ্রেডিংয়ের মাধ্যমে অর্জন করা যায়।
কনকারেন্ট প্রোগ্রামিং উদাহরণ
import concurrent.futures
import time
# ফাংশন যা এক সেকেন্ড অপেক্ষা করে এবং নম্বর প্রিন্ট করে
def print_number(num):
time.sleep(1)
return f"Number: {num}"
# থ্রেড পুল এক্সিকিউটর ব্যবহার করে কনকারেন্ট এক্সিকিউশন
with concurrent.futures.ThreadPoolExecutor() as executor:
results = [executor.submit(print_number, i) for i in range(1, 6)]
for future in concurrent.futures.as_completed(results):
print(future.result())
এখানে, ThreadPoolExecutor ব্যবহার করে পাঁচটি কাজ সমান্তরালে (কনকারেন্টলি) চালানো হয়েছে। প্রতিটি কাজ এক সেকেন্ডে সম্পন্ন হলেও, কনকারেন্টভাবে চলার কারণে সময় অনেক কম লাগে।
মাল্টিপ্রসেসিং (Multiprocessing)
মাল্টিপ্রসেসিং মাল্টিকোর CPU ব্যবহার করে কাজ সম্পন্ন করার প্রক্রিয়া। এটি প্রতিটি প্রসেসকে সম্পূর্ণ আলাদা মেমোরি স্পেস প্রদান করে, যা থ্রেডের চেয়ে নিরাপদ এবং দ্রুত।
মাল্টিপ্রসেসিং উদাহরণ
from multiprocessing import Process
# একটি সাধারণ ফাংশন যা নম্বর প্রিন্ট করে
def print_numbers():
for i in range(1, 6):
print(f"Number: {i}")
# মাল্টিপ্রসেসিং ব্যবহার করে ফাংশন চালানো
process = Process(target=print_numbers)
process.start()
# মেইন প্রসেসে অন্যান্য কাজ সম্পাদন করা
print("This will print while the process is running.")
process.join()
মাল্টিপ্রসেসিং বনাম মাল্টিথ্রেডিং
| বৈশিষ্ট্য | মাল্টিপ্রসেসিং | মাল্টিথ্রেডিং |
|---|---|---|
| প্রসেস | প্রতিটি প্রসেস আলাদা মেমোরি স্পেস নিয়ে কাজ করে | থ্রেড একই মেমোরি স্পেস শেয়ার করে |
| গতি | CPU-বাউন্ড কাজের জন্য উপযোগী | I/O-বাউন্ড কাজের জন্য উপযোগী |
| সিদ্ধান্ত | থ্রেডের চেয়ে নিরাপদ, কিন্তু কিছুটা ধীর | দ্রুত, কিন্তু রেস কন্ডিশন এবং ডেডলকের ঝুঁকি |
| রিসোর্স | বেশি রিসোর্স ব্যবহার করে | তুলনামূলকভাবে কম রিসোর্স ব্যবহার করে |
গ্লোবাল ইন্টারপ্রেটার লক (GIL) এবং মাল্টিথ্রেডিং
পাইথনে একটি গ্লোবাল ইন্টারপ্রেটার লক (GIL) রয়েছে, যা এক সময়ে এক থ্রেড চালানোর অনুমতি দেয়। এটি CPU-বাউন্ড কাজের ক্ষেত্রে মাল্টিথ্রেডিংকে সীমিত করে, কিন্তু I/O-বাউন্ড কাজের জন্য মাল্টিথ্রেডিং কার্যকর।
সারসংক্ষেপ
- মাল্টিথ্রেডিং: একাধিক থ্রেড তৈরি করে I/O-বাউন্ড কাজ দ্রুত করার প্রক্রিয়া।
- মাল্টিপ্রসেসিং: একাধিক প্রসেস তৈরি করে CPU-বাউন্ড কাজ দ্রুত করার প্রক্রিয়া।
- কনকারেন্সি: একাধিক কাজ সমান্তরালে করার প্রক্রিয়া, যা মাল্টিপ্রসেসিং বা মাল্টিথ্রেডিং দিয়ে অর্জন করা যায়।
মাল্টিথ্রেডিং এবং কনকারেন্সি প্রোগ্রামিং কোডের কার্যকারিতা এবং দক্ষতা বাড়ায়, যা বড় বড় কাজ কম সময়ে সম্পাদন করতে সহায়ক।
Read more