2010-12-05 6 views
6

Dies ist ein riskantes Geschäft, und ich verstehe das Global Interpreter Lock als einen furchtbaren Gegner der Parallelität. Wenn ich jedoch NumPy's C API (speziell das Makro PyArray_DATA auf einem NumPy-Array) verwende, gibt es mögliche Konsequenzen, um es aus mehreren gleichzeitigen Threads aufzurufen?Welche Auswirkungen hat das Aufrufen der C API-Funktionen von NumPy aus mehreren Threads?

Beachten Sie, dass ich immer noch die GIL besitzen und nicht mit freigeben werde. Auch wenn NumPy keine Garantie für die Fadensicherheit gibt, aber PyArray_DATA ist in der Praxis fadensicher, das ist gut genug für mich.

Ich benutze Python 2.6.6 mit NumPy 1.3.0 unter Linux.

Antwort

6

Beantworten Sie meine eigene Frage hier, aber nachdem ich in den Quellcode für NumPy 1.3.0 stocherte, glaube ich, die Antwort ist: Ja, PyArray_DATA ist thread-safe.

  1. PyArray_DATA in ndarrayobject.h definiert ist:

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data)) 
    
  2. Der Typ PyArrayObject struct ist in der gleichen Datei definiert sind; das Feld von Interesse ist:

    char *data; 
    

    So, jetzt ist die Frage, ob data von mehreren Threads Zugriff sicher ist oder nicht.

  3. Wenn ein neues NumPy-Array von Grund auf neu erstellt wird (d. H. Nicht aus einer vorhandenen Datenstruktur abgeleitet wird), wird ein Datenzeiger NULL an PyArray_NewFromDescr übergeben, der in arrayobject.c definiert ist.

  4. Dies bewirkt, dass PyArray_NewFromDescrPyDataMem_NEW aufruft, um Speicher für das Feld 0Ades PyArrayObject zuzuweisen. Das ist einfach ein Makro für malloc:

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

Zusammengefasst PyArray_DATA ist Thread-sicher und solange die NumPy Arrays separat erstellt werden, ist es sicher, um sie von verschiedenen Threads zu schreiben.

Verwandte Themen