2010-12-05 29 views
6

यह जोखिम भरा व्यवसाय है, और मैं समांतरता के एक भयंकर दुश्मन होने के लिए ग्लोबल इंटरप्रेटर लॉक को समझता हूं। हालांकि, अगर मैं NumPy's C API (विशेष रूप से PyArray_DATA मैक्रो को न्यूमपी सरणी पर उपयोग कर रहा हूं) का उपयोग कर रहा हूं, तो क्या यह कई समवर्ती धागे से इसे आमंत्रित करने के संभावित परिणाम हैं?कई धागे से NumPy के सी एपीआई कार्यों को कॉल करने के प्रभाव क्या हैं?

ध्यान दें कि मैं अभी भी जीआईएल का मालिक हूं और NumPy's threading support के साथ इसे जारी नहीं करूँगा। इसके अलावा, अगर NumPy थ्रेड सुरक्षा के बारे में कोई गारंटी नहीं देता है, लेकिन PyArray_DATA अभ्यास में थ्रेड-सुरक्षित है, जो मेरे लिए पर्याप्त है

मैं लिनक्स पर न्यूमिप् 1.3.0 के साथ पायथन 2.6.6 चला रहा हूं।

उत्तर

6

यहां अपने स्वयं के प्रश्न का उत्तर दें, लेकिन NumPy 1.3.0 के लिए स्रोत कोड में पोक करने के बाद, मेरा मानना ​​है कि जवाब है: हां, PyArray_DATA थ्रेड-सुरक्षित है।

  1. PyArray_DATA ndarrayobject.h में परिभाषित किया गया है:

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data)) 
    
  2. PyArrayObject struct प्रकार एक ही फाइल में परिभाषित है, ब्याज की क्षेत्र है:

    char *data; 
    

    तो अब, सवाल यह है कि एक से अधिक थ्रेड से data तक पहुँचने सुरक्षित है या नहीं है।

  3. स्क्रैच से एक नया NumPy सरणी है (यानी एक मौजूदा डेटा संरचना से यह पाने नहीं) PyArray_NewFromDescr करने के लिए एक NULL डेटा सूचक, arrayobject.c में परिभाषित गुजरता बना रहा है।

  4. इस आदेश PyArrayObject के data क्षेत्र के लिए स्मृति को आबंटित करने में PyDataMem_NEW आह्वान करने के लिए PyArray_NewFromDescr कारण बनता है।

    #define PyDataMem_NEW(size) ((char *)malloc(size)) 
    

सारांश में, PyArray_DATA धागा सुरक्षित है और जब तक NumPy सरणी के लिए अलग से बनाए जाते हैं, यह अलग धागे से उन्हें लिखने के लिए सुरक्षित है: यह केवल malloc के लिए एक मैक्रो है।