यह काफी दिलचस्प विश्लेषण करने के लिए है। यहाँ बनाम बहु सूत्रण पूल बहु बनाम greenlets के प्रदर्शन की तुलना करने के लिए एक कोड है:
Using gevent it took: 0.083758
-----------
Using multiprocessing it took: 0.023633
-----------
Using multi-threading it took: 0.008327
मुझे लगता है कि greenlet का दावा है कि यह है कि यह विपरीत Gil द्वारा बाध्य नहीं है:
import gevent
from gevent import socket as gsock
import socket as sock
from multiprocessing import Pool
from threading import Thread
from datetime import datetime
class IpGetter(Thread):
def __init__(self, domain):
Thread.__init__(self)
self.domain = domain
def run(self):
self.ip = sock.gethostbyname(self.domain)
if __name__ == "__main__":
URLS = ['www.google.com', 'www.example.com', 'www.python.org', 'www.yahoo.com', 'www.ubc.ca', 'www.wikipedia.org']
t1 = datetime.now()
jobs = [gevent.spawn(gsock.gethostbyname, url) for url in URLS]
gevent.joinall(jobs, timeout=2)
t2 = datetime.now()
print "Using gevent it took: %s" % (t2-t1).total_seconds()
print "-----------"
t1 = datetime.now()
pool = Pool(len(URLS))
results = pool.map(sock.gethostbyname, URLS)
t2 = datetime.now()
pool.close()
print "Using multiprocessing it took: %s" % (t2-t1).total_seconds()
print "-----------"
t1 = datetime.now()
threads = []
for url in URLS:
t = IpGetter(url)
t.start()
threads.append(t)
for t in threads:
t.join()
t2 = datetime.now()
print "Using multi-threading it took: %s" % (t2-t1).total_seconds()
यहाँ
परिणाम हैं multithreading पुस्तकालय। इसके अलावा, ग्रीनलेट डॉक्टर का कहना है कि यह नेटवर्क संचालन के लिए है। नेटवर्क गहन ऑपरेशन के लिए, थ्रेड-स्विचिंग ठीक है और आप देख सकते हैं कि मल्टीथ्रेडिंग दृष्टिकोण बहुत तेज़ है। यह भी हमेशा पाइथन के आधिकारिक पुस्तकालयों का उपयोग करने के लिए prefeerable है; मैंने विंडोज़ पर ग्रीनलेट स्थापित करने की कोशिश की और एक डीएल निर्भरता समस्या का सामना किया, इसलिए मैंने इस परीक्षण को लिनक्स वीएम पर चलाया। हमेशा किसी भी मशीन पर चलने वाली उम्मीद के साथ एक कोड लिखने का प्रयास करें।
@Imran यह जावा में greenthreads के बारे में है का उपयोग कर आई/ओ में कुछ महत्वपूर्ण अंतर है। मेरा सवाल पाइथन में ग्रीनलेट के बारे में है। क्या मैं कुछ भूल रहा हूँ ? – Rsh
अफैइक, पाइथन में धागे वास्तव में वैश्विक दुभाषिया ताला के कारण वास्तव में समवर्ती नहीं हैं। तो यह दोनों समाधानों के ऊपरी हिस्से की तुलना करने के लिए उबाल जाएगा। हालांकि मैं समझता हूं कि पाइथन के कई कार्यान्वयन हैं, इसलिए यह उन सभी के लिए लागू नहीं हो सकता है। – didierc
@didierc CPython (और अभी तक पीपीपीई) समानांतर * में पाइथन (बाइट) कोड * की व्याख्या नहीं करेगा (यानी, वास्तव में शारीरिक रूप से दो अलग-अलग CPU कोरों पर)। हालांकि, जीआईएल के तहत एक पायथन कार्यक्रम नहीं है (सामान्य उदाहरण आई/ओ और सी कार्यों सहित सिस्कोल हैं जो जानबूझकर जीआईएल जारी करते हैं), और 'थ्रेडिंग। थ्रेड' वास्तव में सभी रैमिकेशंस के साथ एक ओएस थ्रेड है। तो यह वास्तव में इतना आसान नहीं है। वैसे, ज्योथन के पास कोई गिला AFAIK नहीं है और पीपीपी भी इससे छुटकारा पाने की कोशिश कर रहा है। – delnan