मैं पायथन 2.7 का उपयोग कर जीए पर एक ऐप विकसित कर रहा था, एक एजेक्स कॉल एपीआई से कुछ डेटा अनुरोध करता है, एक अनुरोध में ~ 200 एमएस लग सकता है, हालांकि जब मैं दो ब्राउज़र खोलता हूं और दो बनाता हूं बहुत ही घंटों में अनुरोध करते हैं कि वे उसमें से दो गुना अधिक लेते हैं, मैंने सबकुछ थ्रेड में डालने की कोशिश की है लेकिन यह काम नहीं कर रहा है .. (यह तब होता है जब ऐप ऑनलाइन होता है, न केवल dev-server पर)पायथन में समांतरता सही काम नहीं कर रही है
तो मैं इस साधारण परीक्षण लिखा था कि अगर यह सामान्य रूप में अजगर में एक समस्या है (एक व्यस्त प्रतीक्षा के मामले में) देखने के लिए यहाँ कोड और परिणाम है,:,
def work():
t = datetime.now()
print threading.currentThread(), t
i = 0
while i < 100000000:
i+=1
t2 = datetime.now()
print threading.currentThread(), t2, t2-t
if __name__ == '__main__':
print "single threaded:"
t1 = threading.Thread(target=work)
t1.start()
t1.join()
print "multi threaded:"
t1 = threading.Thread(target=work)
t1.start()
t2 = threading.Thread(target=work)
t2.start()
t1.join()
t2.join()
पर मैक ओएस एक्स परिणाम सी अयस्क i7 (4 कोर, 8 धागे), पायथन 2.7:
single threaded:
<Thread(Thread-1, started 4315942912)> 2011-12-06 15:38:07.763146
<Thread(Thread-1, started 4315942912)> 2011-12-06 15:38:13.091614 0:00:05.328468
multi threaded:
<Thread(Thread-2, started 4315942912)> 2011-12-06 15:38:13.091952
<Thread(Thread-3, started 4323282944)> 2011-12-06 15:38:13.102250
<Thread(Thread-3, started 4323282944)> 2011-12-06 15:38:29.221050 0:00:16.118800
<Thread(Thread-2, started 4315942912)> 2011-12-06 15:38:29.237512 0:00:16.145560
यह बहुत चौंकाने वाला है !! यदि एक धागा को ऐसा करने में 5 सेकंड लगेंगे .. मैंने सोचा था कि एक ही समय में दो धागे शुरू करने के लिए दोनों कार्यों को पूरा करने के लिए एक ही समय लगेगा, लेकिन यह लगभग तीन गुना लेता है .. यह पूरे थ्रेडिंग विचार को बेकार बनाता है, जैसा कि अनुक्रमिक रूप से उन्हें करना तेज़ होगा!
क्या मैं यहाँ याद आ रही है ..
क्या आपने पाइथन में ग्लोबल इंटरप्रेटर लॉक (जीआईएल) के बारे में कुछ भी पढ़ा है? यदि आप समांतर प्रसंस्करण चाहते हैं तो आपको मल्टीप्रोसेसिंग देखना चाहिए, थ्रेडिंग नहीं। निष्पादन एक समय में एक ही थ्रेड तक ही सीमित है जब तक कि जिन पुस्तकालयों के साथ आप काम कर रहे हैं उन्हें विशेष रूप से जीआईएल जारी करने के लिए डिज़ाइन किया गया है। –
आपका बेंचमार्क खराब डिजाइन किया गया है।आपका वास्तविक उपयोग केस आईओ-बाउंड होगा, सीपीयू-बाध्य नहीं। पाइथन का जीआईएल प्रत्येक मामले में काफी अलग व्यवहार करता है। आपके वास्तविक उपयोग मामले में थ्रेडिंग * आपके लिए ठीक काम करना चाहिए। – zeekay
@ g.d.d.c। मल्टीप्रोसेसिंग GAE – bpgergo