2013-09-05 6 views
5

के साथ पाइथन मल्टीप्रोसेसिंग पूल कोड परीक्षण nose के साथ परीक्षण लिखने की कोशिश कर रहा हूं जो मल्टीप्रोसेसिंग का उपयोग करके गणना की गई है।नाक

code/ 
    tests/ 
     tests.py 

tests.py इस तरह दिखता है:

import multiprocessing as mp 


def f(i): 
    return i ** 2 


pool = mp.Pool() 
out = pool.map(f, range(10)) 


def test_pool(): 
    """Really simple test that relies on the output of pool.map. 
    The actual tests are much more complicated, but this is all 
    that is needed to produce the problem.""" 
    ref_out = map(f, range(10)) 
    assert out == ref_out 

if __name__ == '__main__': 
    test_pool() 

code निर्देशिका से चल रहा है, python tests/tests.pyगुजरता

मैं इस निर्देशिका संरचना है।

nosetests tests/tests.pyपूरा करने के लिए विफल रहता है। यह शुरू होता है, लेकिन pool.map पर कॉल के माध्यम से कभी नहीं मिलता है और बस लटकता है।

यह क्यों है और सबसे आसान समाधान क्या है?

+0

ऐसा नहीं है कि 'nose' कुछ सूत्रण उपयोग कर रहा है और/या प्रवेश जब चल रहा है संभव है यहाँ एक संभावना (शायद pool और out वैश्विक रूप में रखते हुए सरल परिवर्तन) है परीक्षण। यह * यूनिक्स सिस्टम पर मल्टीप्रोसेसिंग के साथ मिश्रित होने पर डेडलॉक्स का कारण बन सकता है। यह अजगर कार्यान्वयन के साथ कोई समस्या नहीं है, लेकिन 'कांटा()' फ़ंक्शन स्वयं ही है, जो केवल वर्तमान धागे को फोर्क करता है, [यह] देखें (http://stackoverflow.com/questions/6078712/is-it-safe-to -फर्क-इन-ए-थ्रेड/607966 9 # 607966 9) अधिक विस्तार स्पष्टीकरण के लिए उत्तर दें। – Bakuriu

+0

मेरा मानना ​​है कि एकमात्र (?) समाधान 'मल्टीप्रोसेसिंग' मॉड्यूल का नकल करना होगा। असल में मैं नहीं देखता कि आपका उदाहरण परीक्षण कर रहा है। यह वास्तव में 'multiprocessing.Pool.map' विधि के लिए एकजुट है, और' f' फ़ंक्शन के लिए नहीं! – Bakuriu

+0

यह न्यूनतम उदाहरण है जो मेरी त्रुटि को पुन: उत्पन्न करता है। मैं अन्य सामानों का एक भार परीक्षण कर रहा हूं जो इनपुट के रूप में 'pool.map' के परिणाम का उपयोग करता है। – aaren

उत्तर

4

समस्या इस तथ्य से संबंधित है कि pool.map को "वैश्विक स्तर" पर बुलाया जाता है। आम तौर पर आप इससे बचना चाहते हैं, क्योंकि इन बयानों को निष्पादित किया जाएगा भले ही आपकी फ़ाइल बस आयात की गई हो।

नाक को import your module आपके परीक्षणों को खोजने में सक्षम होने के लिए है और बाद में उन्हें निष्पादित करने में सक्षम है, इसलिए मेरा मानना ​​है कि समस्या तब होती है जब आयात तंत्र में प्रवेश होता है (मैंने इस व्यवहार के लिए सही कारण खोजने का प्रयास नहीं किया है)

आपको अपने प्रारंभिक कोड को इसके बजाय एक परीक्षण स्थिरता में ले जाना चाहिए; नाक with_setup सजावट के साथ जुड़नार का समर्थन करता है।

import multiprocessing as mp 
from nose import with_setup 

pool = None 
out = None 

def f(i): 
    return i ** 2 

def setup_func(): 
    global pool 
    global out 
    pool = mp.Pool() 
    out = pool.map(f, range(10)) 

@with_setup(setup_func) 
def test_pool(): 
    """Really simple test that relies on the output of pool.map. 
    The actual tests are much more complicated, but this is all 
    that is needed to produce the problem.""" 
    global out 
    ref_out = map(f, range(10)) 
    assert out == ref_out 

if __name__ == '__main__': 
    test_pool() 

निष्पादित:

$ nosetests tests/tests.py 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.011s 

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