Was sind die Auswirkungen von NumPy der C-API-Funktionen von mehreren Threads aufrufen?
-
08-10-2019 - |
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.
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
-
PyArray_DATA
definiert in ndarrayobject.h:#define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
-
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. -
neues NumPy Array von Grund auf neu erstellen (das heißt nicht, dass es aus einer vorhandenen Datenstruktur abzuleiten) übergibt einen
NULL
Datenzeiger aufPyArray_NewFromDescr
, in arrayobject.c definiert. -
PyArray_NewFromDescr
Diese UrsachenPyDataMem_NEW
um aufzurufen Speicher für dendata
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.