पर ब्लॉक नहीं करती मैं काफी अजगर करने के लिए नया हूँ। मैं stdin पर टेक्स्ट की पंक्तियों को पढ़ने के लिए, उन्हें किसी तरह से परिवर्तित करने और उन्हें एक डेटाबेस में लिखने के लिए बहु मॉड्यूल का उपयोग कर रहा हूँ। जब तक मैं बड़ा इनपुट फ़ाइलें (लाइनों के लाखों-करोड़ों) मेरी अजगर कार्यक्रम में कार्रवाई करने के लिए है कि मैं पाइप मिलता है,अजगर पूल apply_async और map_async पूर्ण कतार
batch = []
pool = multiprocessing.Pool(20)
i = 0
for i, content in enumerate(sys.stdin):
batch.append(content)
if len(batch) >= 10000:
pool.apply_async(insert, args=(batch,i+1))
batch = []
pool.apply_async(insert, args=(batch,i))
pool.close()
pool.join()
अब जब कि सब ठीक काम करता है: यहाँ मेरी कोड का एक टुकड़ा है। किसी बिंदु पर, जब मेरा डेटाबेस धीमा हो जाता है, तो मुझे लगता है कि स्मृति पूर्ण हो रही है।
कुछ खेलने के बाद, यह पता चला कि pool.apply_async के साथ-साथ pool.map_async कभी भी अवरुद्ध नहीं होता है, ताकि संसाधित होने वाली कॉल की कतार बड़ी और बड़ी हो।
मेरी समस्या को सही दृष्टिकोण क्या है? मैं एक पैरामीटर की अपेक्षा करता हूं जिसे मैं सेट कर सकता हूं, जो पूल.एपली_एसिंक कॉल को अवरुद्ध कर देगा, जैसे ही एक निश्चित कतार लंबाई तक पहुंच गई है। जावा में AFAIR कोई भी उस उद्देश्य के लिए एक निश्चित लंबाई के साथ ThreadPoolExecutor को एक ब्लॉकिंगक्यूयू दे सकता है।
धन्यवाद!
_ "यह रूप में अच्छी तरह कि pool.apply_async निकला pool.map_async कभी ब्लॉक कभी नहीं के रूप में" _ - सब कुछ मैं अच्छी तरह से AsyncResult पर इंतजार कर अपनी समस्या के रूप में मदद नहीं करता – leon