2010-09-30 11 views
23

मैं अजगर 2.7 का उपयोग कर रहा हूं, और कुछ सीपीयू भारी कार्यों को अपनी प्रक्रियाओं में चलाने की कोशिश कर रहा हूं। मैं प्रक्रिया की वर्तमान स्थिति के बारे में सूचित रखने के लिए अभिभावक प्रक्रिया में संदेशों को वापस भेजने में सक्षम होना चाहता हूं। मल्टीप्रोसेसिंग कतार इस के लिए बिल्कुल सही लगता है लेकिन मैं यह नहीं समझ सकता कि इसे कैसे प्राप्त किया जाए।क्या मैं Pool.imap नामक फ़ंक्शन में एक मल्टीप्रोसेसिंग कतार का उपयोग कर सकता हूं?

तो, यह मेरा मूल कार्य उदाहरण है जो एक कतार के उपयोग से कम है।

import multiprocessing as mp 
import time 

def f(x): 
    return x*x 

def main(): 
    pool = mp.Pool() 
    results = pool.imap_unordered(f, range(1, 6)) 
    time.sleep(1) 

    print str(results.next()) 

    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 

मैं कई मायनों में कतार गुजर की कोशिश की है, और वे त्रुटि संदेश मिलता है "RuntimeError: कतार वस्तुओं केवल विरासत के माध्यम से प्रक्रियाओं के बीच साझा किया जाना चाहिए"। मैंने पाया कि पहले के उत्तर के आधार पर मैंने कोशिश की है। (मैं एक ही Pool.map_async और Pool.imap का उपयोग करने की कोशिश कर समस्या मिल)

import multiprocessing as mp 
import time 

def f(args): 
    x = args[0] 
    q = args[1] 
    q.put(str(x)) 
    time.sleep(0.1) 
    return x*x 

def main(): 
    q = mp.Queue() 
    pool = mp.Pool() 
    results = pool.imap_unordered(f, ([i, q] for i in range(1, 6))) 

    print str(q.get()) 

    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 

अंत में, 0 फिटनेस दृष्टिकोण (यह वैश्विक बनाने के) कोई संदेश उत्पन्न नहीं करता है, यह सिर्फ अप अवरोधित करता है।

import multiprocessing as mp 
import time 

q = mp.Queue() 

def f(x): 
    q.put(str(x)) 
    return x*x 

def main(): 
    pool = mp.Pool() 
    results = pool.imap_unordered(f, range(1, 6)) 
    time.sleep(1) 

    print q.get() 

    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 

मुझे पता है कि यह शायद multiprocessing.Process सीधे के साथ और कहा कि अन्य पुस्तकालयों यह पूरा करने के देखते हैं काम करेंगे हूँ, लेकिन मैं मानक पुस्तकालय कार्यों कि एक महान फिट हैं जब तक मैं से दूर वापस करने के लिए नफरत मुझे यकीन है कि यह सिर्फ मुझे ज्ञान का अभाव नहीं है बल्कि मुझे उनका शोषण करने में सक्षम होने से रोकता है।

धन्यवाद।

+0

क्या आपने जग का उपयोग करने पर विचार किया है: http://luispedro.org/software/jug? – luispedro

उत्तर

41

चाल कतार को प्रारंभकर्ता के लिए एक तर्क के रूप में पारित करना है। सभी पूल प्रेषण विधियों के साथ काम करने के लिए प्रकट होता है।

import multiprocessing as mp 

def f(x): 
    f.q.put('Doing: ' + str(x)) 
    return x*x 

def f_init(q): 
    f.q = q 

def main(): 
    jobs = range(1,6) 

    q = mp.Queue() 
    p = mp.Pool(None, f_init, [q]) 
    results = p.imap(f, jobs) 
    p.close() 

    for i in range(len(jobs)): 
     print q.get() 
     print results.next() 

if __name__ == '__main__': 
    main() 
+3

'multiprocessing.Pool' के लिए 'प्रारंभकर्ता' और 'initargs' तर्कों के उद्देश्य और उपयोगिता का बहुत अच्छा प्रदर्शन! –

+0

क्या आप कृपया समझा सकते हैं, यह क्यों काम करता है? जब आप f.q = q करते हैं तो क्या खुश होता है? – kepkin

+2

@ केपकिन पाइथन में, प्रत्येक फ़ंक्शन एक ऑब्जेक्ट है (http://docs.python.org/reference/datamodel.html#the- मानक- टाइप- पदानुक्रम कॉल करने योग्य प्रकार देखें)। इसलिए, f.q फ़ंक्शन ऑब्जेक्ट f पर q नामक एक विशेषता सेट कर रहा है। क्यूई ऑब्जेक्ट को बाद में उपयोग के लिए सहेजने के लिए यह एक त्वरित और हल्का तरीका था। – Olson

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