目次
1. परिचय
Python बहु-उद्देश्यीय प्रोग्रामिङ भाषा हो, जसले डेटा प्रशोधन, मेसिन लर्निङ, वेब विकास जस्ता क्षेत्रहरूमा विशेष गरी शक्तिशाली उपकरण प्रदान गर्दछ। त्यसमा, multiprocessing मोड्युल समानान्तर प्रक्रिया कार्यान्वयन गर्नको लागि महत्वपूर्ण लाइब्रेरी हो। यस लेखमा, Python को multiprocessing मोड्युलको आधारभूत प्रयोगदेखि उन्नत प्रयोगसम्म, दृश्यात्मक पूरकहरूसहित विस्तृत रूपमा व्याख्या गरी, प्रदर्शनलाई अधिकतम बनाउनका लागि व्यावहारिक प्रविधिहरू प्रस्तुत गरिनेछ।2. multiprocessing भनेको के हो?
2.1 समानान्तर प्रक्रिया को आवश्यकता
Python सामान्यतया सिंगल थ्रेडमा चल्छ, तर भारी प्रक्रिया वा ठूलो डेटा ह्यान्डल गर्दा, यो विधिमा प्रक्रिया गति सीमित हुन्छ। समानान्तर प्रक्रिया प्रयोग गरेर, धेरै कार्यहरू एकै समयमा चलाउन, CPU को सबै कोरलाई प्रभावकारी रूपमा प्रयोग गर्न, र प्रक्रिया समय घटाउन सकिन्छ।multiprocessing मोड्युल ले Python को GIL(Global Interpreter Lock)लाई टाढा राखी, धेरै प्रक्रिया प्रयोग गरेर वास्तविक समानान्तर प्रक्रिया सम्भव बनाउँछ।2.2 सिंगल थ्रेडसँगको भिन्नता
सिंगल थ्रेडमा, एक प्रक्रिया कार्यलाई क्रमिक रूपमा चलाउँछ, तरमल्टिप्रोसेसमा धेरै प्रक्रिया समानान्तर रूपमा कार्यलाई प्रक्रिया गर्छन्। यसले विशेष गरी CPU‑बाउन्ड कार्यहरू(जस्तै ठूला संख्यात्मक गणना वा डेटा विश्लेषण)मा प्रदर्शन सुधार्छ।3. multiprocessing मोड्युलको मूल संरचना
3.1 Process क्लासको प्रयोग
multiprocessing
मोड्युलको आधारभूत कुरा Process क्लासको प्रयोग हो। यो क्लास प्रयोग गरेर, सजिलै नयाँ प्रक्रिया सिर्जना गर्न र समानान्तर प्रक्रिया सञ्चालन गर्न सकिन्छ।import multiprocessing
def worker_function():
print("नयाँ प्रक्रिया चलाइयो")
if __name__ == "__main__":
process = multiprocessing.Process(target=worker_function)
process.start()
process.join()
यो कोडमा, worker_function
लाई नयाँ प्रक्रियामा चलाइन्छ। start()
मेथडले प्रक्रिया सुरु गर्छ, र join()
मेथडले प्रक्रियाको समाप्तिको पर्खाइ गर्न सक्छ।3.2 प्रक्रियामा आर्गुमेन्ट पास गर्ने तरिका
प्रक्रियामा आर्गुमेन्ट पास गर्न,args
पैरामीटर प्रयोग गरिन्छ। तलको उदाहरणमा, worker
फङ्क्शनलाई आर्गुमेन्ट पास गरेर चलाइन्छ।def worker(number):
print(f'Worker {number} चलाइयो')
if __name__ == "__main__":
process = multiprocessing.Process(target=worker, args=(5,))
process.start()
process.join()
यसले प्रक्रियामा गतिशील डेटा पास गरेर कार्यलाई समानान्तर रूपमा गर्न सकिन्छ।4. डेटा साझेदारी र समक्रमण
4.1 साझा मेमोरी प्रयोग गरेर डेटा साझेदारी
मल्टिप्रोसेसमा, प्रक्रिया बीच डेटा सुरक्षित रूपमा साझेदारी गर्न Value र Array प्रयोग गरिन्छ। यी साझा मेमोरी वस्तुहरू हुन्, जसले धेरै प्रक्रिया एकै समयमा पहुँच गर्दा पनि डेटा सुरक्षित रूपमा सञ्चालन गर्न सक्षम बनाउँछ।import multiprocessing
def increment_value(shared_value):
with shared_value.get_lock():
shared_value.value += 1
if __name__ == "__main__":
shared_value = multiprocessing.Value('i', 0)
processes = [multiprocessing.Process(target=increment_value, args=(shared_value,)) for _ in range(5)]
for process in processes:
process.start()
for process in processes:
process.join()
print(f'अन्तिम मान: {shared_value.value}')
उपरोक्त कोडले ५ प्रक्रिया एकै समयमा साझा मेमोरीभित्रको पूर्णांक मानलाई इन्क्रिमेन्ट गर्ने उदाहरण हो। get_lock()
प्रयोग गरेर डेटा प्रतिस्पर्धा रोकिएको छ।4.2 लक प्रयोग गरेर डेटा प्रतिस्पर्धा रोक्नु
धेरै प्रक्रिया एकै समयमा डेटा सञ्चालन गर्दा, लक मेकानिज्म प्रयोग गरेर डेटा प्रतिस्पर्धा रोकिन्छ।Lock
वस्तु प्रयोग गरेर प्रक्रिया बीचको समक्रमण सुनिश्चित हुन्छ।
5. प्रोसेस पूल प्रयोग गरेर कार्यको वितरण
5.1 Pool वर्गको प्रयोग
Pool
वर्ग प्रयोग गर्दा, धेरै कार्यहरूलाई विभाजन गरी धेरै प्रक्रियाहरूमा समानान्तर रूपमा चलाउन सकिन्छ। ठूलो डेटा प्रशोधन वा कार्य वितरण आवश्यक परेमा यो अत्यन्त उपयोगी हुन्छ।from multiprocessing import Pool
def square(x):
return x * x
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.map(square, range(10))
print(results)
यो कोडमा, सूचीका तत्वहरूमा वर्ग गणना गरी, त्यसलाई ४ वटा प्रक्रियामा बाँडेर समानान्तर रूपमा चलाइन्छ।map()
फलन प्रयोग गरेर, कार्यलाई प्रक्रियामा सजिलै वितरित गर्न सकिन्छ।चित्रण: Pool वर्गद्वारा कार्य वितरण
5.2 अनुप्रयोग उदाहरण: starmap प्रयोग गरेर बहु-आर्ग्युमेन्टको प्रक्रिया
starmap()
प्रयोग गर्दा, बहु आर्ग्युमेन्ट भएको फलनलाई समानान्तर रूपमा प्रक्रिया गर्न सकिन्छ। उदाहरणका लागि, तलको जस्तै आर्ग्युमेन्टको जोडीहरूमा आधारित प्रक्रिया गर्न सकिन्छ।def multiply(x, y):
return x * y
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.starmap(multiply, [(1, 2), (3, 4), (5, 6), (7, 8)])
print(results)
6. CPU स्रोतको उत्तम उपयोग
6.1 cpu_count()
प्रयोग गरेर प्रक्रिया संख्या अनुकूलन
Python को multiprocessing.cpu_count()
प्रयोग गरेर, प्रणालीको भौतिक कोर संख्या स्वचालित रूपमा प्राप्त गर्न सकिन्छ, र त्यस अनुसार प्रक्रिया संख्या सेट गर्न सकिन्छ। यसले अत्यधिक प्रक्रिया निर्माणलाई रोक्छ, र सम्पूर्ण प्रणालीको प्रदर्शनलाई अनुकूलन गर्दछ।from multiprocessing import Pool, cpu_count
if __name__ == "__main__":
with Pool(cpu_count() - 1) as pool:
results = pool.map(square, range(100))
print(results)
6.2 सिस्टम स्रोतको प्रभावकारी उपयोग
सबै CPU कोरहरू प्रयोग गर्नेबाट बच्नुहोस्, र एक कोरलाई प्रणालीको लागि राखेर, अन्य कार्यहरूमा असर नपारी प्रक्रिया समानान्तर बनाउन सकिन्छ।7. वास्तविक उपयोग केसहरू र सर्वश्रेष्ठ अभ्यासहरू
7.1 उपयोग केसका विशिष्ट उदाहरणहरू
multiprocessing तलका जस्ता परिस्थितिहरूमा प्रभावकारी हुन्छ।- ठूलो डेटा प्रशोधन: धेरै फाइलहरूलाई एकै समयमा पढ्न र प्रक्रिया गर्न आवश्यक पर्दा उपयोगी हुन्छ।
- मेशिन लर्निङको समानान्तर प्रशिक्षण: मोडेलको प्रशिक्षणलाई धेरै प्रक्रियाहरूमा एकै समयमा चलाएर समय घटाउँछ।
- वेब क्रोलिङ: धेरै पृष्ठहरूलाई समानान्तरमा क्रोल गरेर, प्रभावकारी रूपमा डेटा सङ्कलन गर्न सकिन्छ।
7.2 सर्वश्रेष्ठ अभ्यासहरू
- संसाधनको उत्तम वितरण: प्रणालीको भौतिक कोर संख्याको आधारमा उपयुक्त प्रक्रिया संख्या सेट गर्नु।
- डिबगिङ र लगिङको उपयोग:
logging
मोड्युल प्रयोग गरेर, प्रत्येक प्रक्रियाको स्थितिलाई ट्र्याक गरी, त्रुटि ह्यान्डलिङलाई उपयुक्त रूपमा सञ्चालन गर्नु।
import logging
import multiprocessing
def worker_function():
logging.info(f'प्रक्रिया {multiprocessing.current_process().name} सुरु भयो')
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
process = multiprocessing.Process(target=worker_function, name='वर्कर1')
process.start()
process.join()
यो कोडमा, logging
प्रयोग गरेर प्रत्येक प्रक्रियाको कार्यलाई रेकर्ड गरी, पछि लग जाँच गर्न सकिन्छ।- त्रुटि ह्यान्डलिङको कार्यान्वयन: multiprocessing मा, धेरै प्रक्रियाहरू एकै समयमा चल्ने कारण त्रुटि ह्यान्डलिङ महत्त्वपूर्ण हुन्छ। प्रक्रिया असामान्य रूपमा समाप्त भए पनि, मुख्य प्रक्रिया वा अन्य प्रक्रियाहरूलाई असर नपरोसको लागि, try-except वाक्य प्रयोग गरेर त्रुटि ह्यान्डलिङ कार्यान्वयन गर्नु।
