Domanda

Questo è rischioso, e capisco il Global Interpreter Lock per essere un nemico formidabile di parallelismo. Tuttavia, se sto utilizzando di NumPy C API (specificamente la macro PyArray_DATA su un array NumPy), ci sono potenziali conseguenze invoca da più thread simultanei?

Si noti che sarò ancora proprio il GIL e non rilasceremo con supporto threading di NumPy . Inoltre, anche se NumPy non fornisce alcuna garanzia circa la sicurezza thread, ma PyArray_DATA è thread-safe, in pratica, che è abbastanza buono per me .

Io corro Python 2.6.6 con NumPy 1.3.0 su Linux.

È stato utile?

Soluzione

Rispondendo alla mia domanda proprio qui, ma dopo frugando nel codice sorgente per NumPy 1.3.0, credo che la risposta è: Sì, PyArray_DATA è thread-safe

.
  1. PyArray_DATA è definito in ndarrayobject.h:

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
    
  2. Il tipo struct PyArrayObject è definito nello stesso file; il campo di interesse è:

    char *data;
    

    Ora, la domanda è se l'accesso ai data da più thread è sicuro o meno.

  3. Creazione di un nuovo array NumPy da zero (cioè, non derivanti da una struttura di dati esistente) passa un puntatore di dati NULL a PyArray_NewFromDescr, definito arrayobject.c.

  4. This cause PyArray_NewFromDescr invocare PyDataMem_NEW per allocare memoria per campo data del PyArrayObject. Questo è semplicemente una macro per malloc:

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

In sintesi, PyArray_DATA è thread-safe e finché gli array NumPy vengono creati separatamente, è sicuro di scrivere a loro da diversi thread.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top