Python Language
समानांतर गणना
खोज…
टिप्पणियों
जीआईएल (ग्लोबल इंटरप्रेटर लॉक) के कारण अजगर इंटरप्रेटर का केवल एक ही उदाहरण एक प्रक्रिया में निष्पादित होता है। इसलिए सामान्य तौर पर, मल्टी-थ्रेडिंग का उपयोग करने से केवल IO बाउंड कंप्यूटर्स में सुधार होता है, न कि सीपीयू-बाउंड वाले में। यदि आप सीपीयू-बाउंड कार्यों को समानांतर करना चाहते हैं, तो multiprocessing
मॉड्यूल की सिफारिश की जाती है।
GIL CPython पर लागू होता है, जो Pythy के साथ-साथ Python का सबसे लोकप्रिय कार्यान्वयन है। Jython और IronPython जैसे अन्य कार्यान्वयनों में कोई GIL नहीं है ।
कार्यों को समानांतर करने के लिए मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करना
import multiprocessing
def fib(n):
"""computing the Fibonacci in an inefficient way
was chosen to slow down the CPU."""
if n <= 2:
return 1
else:
return fib(n-1)+fib(n-2)
p = multiprocessing.Pool()
print(p.map(fib,[38,37,36,35,34,33]))
# Out: [39088169, 24157817, 14930352, 9227465, 5702887, 3524578]
जैसा कि प्रत्येक कॉल fib
का निष्पादन समानांतर में होता है, पूर्ण उदाहरण के निष्पादन का समय दोहरे प्रोसेसर की तुलना में 1.8 × तेज़ होता है, यदि यह अनुक्रमिक तरीके से किया जाता है।
पायथन 2.2+
समानांतर में कोड निष्पादित करने के लिए माता-पिता और बच्चों की स्क्रिप्ट का उपयोग करना
child.py
import time
def main():
print "starting work"
time.sleep(1)
print "work work work work work"
time.sleep(1)
print "done working"
if __name__ == '__main__':
main()
parent.py
import os
def main():
for i in range(5):
os.system("python child.py &")
if __name__ == '__main__':
main()
यह समानांतर, स्वतंत्र HTTP अनुरोध / प्रतिक्रिया कार्यों या डेटाबेस चयन / आवेषण के लिए उपयोगी है। कमांड लाइन के तर्क चाइल्डहोम स्क्रिप्ट को भी दिए जा सकते हैं। लिपियों के बीच सिंक्रोनाइज़ेशन सभी लिपियों द्वारा नियमित रूप से एक अलग सर्वर (जैसे रेडिस उदाहरण) की जाँच करके प्राप्त किया जा सकता है।
कार्यों को समानांतर करने के लिए सी-एक्सटेंशन का उपयोग करना
यहां विचार है कि कम्प्यूटेशनल रूप से गहन नौकरियों को सी (विशेष मैक्रोज़ का उपयोग करके), पायथन से स्वतंत्र स्थानांतरित किया जाए, और काम करते समय सी कोड को जीआईएल जारी किया जाए।
#include "Python.h"
...
PyObject *pyfunc(PyObject *self, PyObject *args) {
...
Py_BEGIN_ALLOW_THREADS
// Threaded C code
...
Py_END_ALLOW_THREADS
...
}
समानांतर करने के लिए PyPar मॉड्यूल का उपयोग करना
PyPar एक पुस्तकालय है जो पायथन में समानता प्रदान करने के लिए संदेश पासिंग इंटरफ़ेस (MPI) का उपयोग करता है। PyPar में एक सरल उदाहरण ( https://github.com/daleroberts/pypar पर देखा गया ) इस तरह दिखता है:
import pypar as pp
ncpus = pp.size()
rank = pp.rank()
node = pp.get_processor_name()
print 'I am rank %d of %d on node %s' % (rank, ncpus, node)
if rank == 0:
msh = 'P0'
pp.send(msg, destination=1)
msg = pp.receive(source=rank-1)
print 'Processor 0 received message "%s" from rank %d' % (msg, rank-1)
else:
source = rank-1
destination = (rank+1) % ncpus
msg = pp.receive(source)
msg = msg + 'P' + str(rank)
pypar.send(msg, destination)
pp.finalize()