Frage

Das ist riskant, und ich verstehe, der Global Interpreter Lock ein gewaltiger Feind der Parallelität zu sein. Allerdings, wenn ich bin mit NumPy der C-API (speziell die PyArray_DATA Makro auf einem NumPy Array), gibt es mögliche Konsequenzen aus mehreren gleichzeitigen Threads aufgerufen wird?

Beachten Sie, dass ich immer noch die GIL besitzt und nicht mit der Freigabe NumPy des Threading-Unterstützung . Auch wenn NumPy nimmt keine Garantie über die Thread-Sicherheit aber PyArray_DATA ist Thread-sicher in der Praxis , die gut genug für mich ist .

Ich bin Python 2.6.6 mit NumPy 1.3.0 unter Linux läuft.

War es hilfreich?

Lösung

Die Beantwortung meiner Frage hier, aber nach NumPy in den Quellcode Stossen 1.3.0, glaube ich, die Antwort lautet: Ja, das ist PyArray_DATA thread-safe

.
  1. PyArray_DATA definiert in ndarrayobject.h:

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
    
  2. Der Typ PyArrayObject Struktur 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. neues NumPy Array von Grund auf neu erstellen (das heißt nicht, dass es aus einer vorhandenen Datenstruktur abzuleiten) übergibt einen NULL Datenzeiger auf PyArray_NewFromDescr, in arrayobject.c definiert.

  4. PyArray_NewFromDescr Diese Ursachen PyDataMem_NEW um aufzurufen Speicher für den data Feld des PyArrayObject zuzuordnen. Das ist einfach ein Makro für malloc:

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top