Python में multiprocessing मॉड्यूल एक शक्तिशाली टूल है जो समानांतर प्रोग्राम बनाने में मदद करता है और मल्टी-कोर प्रोसेसर का कुशलतापूर्वक उपयोग करता है। सामान्य मल्टीथ्रेडिंग के विपरीत, जो Global Interpreter Lock (GIL) द्वारा सीमित है, multiprocessing एक साथ कई प्रोसेस चलाने की अनुमति देता है, जिनमें से प्रत्येक की अपनी मेमोरी और स्वतंत्र निष्पादन होता है।
Multiprocessing के मूल सिद्धांत
Python में मल्टीप्रोसेसिंग अलग-अलग प्रोसेस बनाने पर आधारित है जो प्रोसेसर के विभिन्न कोर पर समानांतर रूप से चल सकते हैं। प्रत्येक प्रोसेस मेमोरी के एक अलग स्थान में काम करता है, जिससे मल्टीथ्रेडिंग में होने वाली शेयर्ड डेटा की समस्याएं खत्म हो जाती हैं।
Multiprocessing मॉड्यूल के मुख्य घटक इस प्रकार हैं:
- Process — अलग-अलग प्रोसेस बनाने और प्रबंधित करने के लिए क्लास
- Pool — कई कार्यों को कुशलतापूर्वक करने के लिए प्रोसेस का पूल
- Queue — प्रोसेस के बीच सुरक्षित डेटा ट्रांसफर के लिए कतारें
- Lock — संसाधनों तक पहुंच को नियंत्रित करने के लिए सिंक्रोनाइज़ेशन तंत्र
- Manager — शेयर्ड डेटा को प्रबंधित करने के लिए ऑब्जेक्ट
Multiprocessing का उपयोग कब करें
Multiprocessing निम्नलिखित मामलों में सबसे प्रभावी है:
CPU-इंटेंसिव कार्य: गणितीय गणना, इमेज प्रोसेसिंग, डेटा एनालिसिस, वैज्ञानिक गणनाएं। ऐसे कार्य प्रोसेसर के विभिन्न कोर पर समानांतर निष्पादन से लाभ उठाते हैं।
बड़े डेटा का प्रोसेसिंग: जब एक ही फंक्शन को कई एलिमेंट्स पर लागू करना हो, multiprocessing निष्पादन को काफी तेज कर सकता है।
स्वतंत्र कार्य: ऐसे ऑपरेशन जिनमें प्रोसेस के बीच बार-बार डेटा एक्सचेंज की आवश्यकता नहीं होती।
I/O-इंटेंसिव कार्यों (फाइलों के साथ काम, नेटवर्क रिक्वेस्ट) के लिए एसिंक्रोनस प्रोग्रामिंग (asyncio) या मल्टीथ्रेडिंग का उपयोग करना बेहतर होता है।
प्रोसेस बनाना और प्रबंधित करना
Process क्लास के साथ बेसिक उदाहरण
import multiprocessing
import time
def worker_task(name, duration):
"""अलग प्रोसेस में चलने वाला फंक्शन"""
print(f"प्रोसेस {name} ने काम शुरू किया")
time.sleep(duration)
print(f"प्रोसेस {name} ने काम पूरा किया")
if __name__ == "__main__":
# प्रोसेस बनाना
process1 = multiprocessing.Process(target=worker_task, args=("Worker-1", 3))
process2 = multiprocessing.Process(target=worker_task, args=("Worker-2", 2))
# प्रोसेस शुरू करना
start_time = time.time()
process1.start()
process2.start()
# प्रोसेस के पूरा होने का इंतजार
process1.join()
process2.join()
end_time = time.time()
print(f"कुल निष्पादन समय: {end_time - start_time:.2f} सेकंड")
Process क्लास से इनहेरिट करना
import multiprocessing
import os
class CustomProcess(multiprocessing.Process):
def __init__(self, name, work_count):
super().__init__()
self.name = name
self.work_count = work_count
def run(self):
"""प्रोसेस में चलने वाला मेथड"""
print(f"प्रोसेस {self.name} (PID: {os.getpid()}) ने काम शुरू किया")
for i in range(self.work_count):
print(f"{self.name}: कार्य {i+1} कर रहा हूं")
time.sleep(1)
print(f"प्रोसेस {self.name} ने काम पूरा किया")
if __name__ == "__main__":
processes = []
# कई प्रोसेस बनाना
for i in range(3):
p = CustomProcess(f"Process-{i+1}", 3)
processes.append(p)
p.start()
# सभी प्रोसेस के पूरा होने का इंतजार
for p in processes:
p.join()
प्रोसेस पूल के साथ काम करना
Pool प्रोसेस के एक समूह को प्रबंधित करने का एक सुविधाजनक इंटरफेस प्रदान करता है।