2013-08-23 3 views
11

में थ्रेडपूल का उपयोग कब करें मैंने देखा है कि गेवेन्ट में थ्रेडपूल ऑब्जेक्ट है। कोई मुझे बता सकता है कि थ्रेडपूल का उपयोग कब और नियमित पूल का उपयोग कब किया जाए? Gevent.threadpool और gevent.pool के बीच क्या अंतर है?गीवेंट

उत्तर

9

जब आपके पास पाइथन कोड का एक टुकड़ा होता है जो चलाने में लंबा समय लगता है (सेकंड) और हरितलेटों के स्विथिंग का कारण नहीं बनता है। (कोई नेटवर्किंग नहीं) अन्य सभी ग्रीनलेट/गीवेंट नौकरियां 'भूखे' होंगी और आपके पास कोई गणना समय नहीं होगा और यह आपके जैसे एप्लिकेशन 'हैंग' जैसा दिखाई देगा।

यदि आप थ्रेडपूल में यह 'भारी' कार्य डालते हैं, तो थ्रेडेड निष्पादन सुनिश्चित करेगा कि अन्य ग्रीनलेट भूखे नहीं होंगे। लेकिन मेरा मानना ​​है कि यदि आपका कोड सी पुस्तकालय में बहुत समय बिताता है तो इसका कोई प्रभाव नहीं पड़ेगा।

नीचे gevent examples से उदाहरण है। ध्यान दें कि उदाहरण time.sleep का उपयोग करता है जो ब्लॉक करता है और gevent.sleep नहीं।

टिप: आप एक पाश है कि एक लंबे समय से तुम सिर्फ पाश में एक gevent.sleep (0) में डाल सकते हैं चलाने के लिए ले जाता है है। प्रत्येक लूप अन्य ग्रीनलेट्स को चलाने का मौका मिलेगा। gevent .sleep (0) अपनी धीमी गति से पाश में यकीन है कि अन्य greenlets भूखा नहीं होगा कर देगा और अनुप्रयोगों उत्तरदायी प्रकट होता है

import time 
import gevent 
from gevent.threadpool import ThreadPool 


pool = ThreadPool(3) 
start = time.time() 
for _ in xrange(4): 
    pool.spawn(time.sleep, 1) 
gevent.wait() 
delay = time.time() - start 
print 'Running "time.sleep(1)" 4 times with 3 threads. Should take about 2 seconds: %.3fs' % delay 
+0

"लेकिन मेरा मानना ​​है कि अगर आपके कोड एसी पुस्तकालय यह होगा में बहुत समय खर्च करता है कोई प्रभाव नहीं "क्या आप निश्चित हैं? क्या आप सी एक्सटेंशन या 'ctypes' का जिक्र कर रहे हैं? क्योंकि यदि आप जीआईएल (मैन्युअल रूप से सी एक्सटेंशन में या स्वचालित रूप से 'ctypes' के रूप में) जारी करते हैं तो आवेदन थ्रेडपूल से लाभान्वित होगा, है ना? – MariusSiuram

+0

हां। "अगर आप जीआईएल जारी करते हैं" बिल्कुल। मेरे पास यह समझने का समय नहीं है कि प्रत्येक सी libary में से ... – Stephan

संबंधित मुद्दे