Каковы последствия вызова функций API Numpy C API из нескольких нитей?

StackOverflow https://stackoverflow.com/questions/4358320

Вопрос

Это рискованный бизнес, и я понимаю, что глобальный переводчик является грозным врагом параллелизма. Однако, если я использую Api numpy (конкретно то PyArray_DATA Макрос на Numpy Array), есть ли потенциальные последствия, чтобы вызвать его из нескольких одновременных потоков?

Обратите внимание, что я все еще буду владеть глыбами и не выпустить его с Огненая поддержка Numpy. Отказ Кроме того, даже если Numpy не гарантирует о безопасности потоков, но PyArray_DATA Безопасен в потоке на практике, Это достаточно хорошо для меня.

Я бегаю Python 2.6.6 с Numpy 1.3.0 на Linux.

Это было полезно?

Решение

Отвечая на мой вопрос здесь, но после того, как явился в исходный код для Numpy 1.3.0, я полагаю, что ответ: Да, PyArray_DATA Безопасен в потоке.

  1. PyArray_DATA определяется в ndarrayobject.h:

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
    
  2. Тип структуры PyarrayObject определяется в том же файле; Область интереса:

    char *data;
    

    Так что теперь вопрос заключается в том, является ли доступ к доступу data Из нескольких потоков безопасны или нет.

  3. Создание нового множества массива с нуля (т. Е. Не получение его из существующей структуры данных) проходит NULL указатель данных на PyArray_NewFromDescr, определенный в arrayobject.c.

  4. Это вызывает PyArray_NewFromDescr вызывать PyDataMem_NEW Для того, чтобы распределить память для PyarrayObject's data поле. Это просто макрос для Malloc:

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

В итоге, PyArray_DATA Безопасен в потоке и до тех пор, пока баллы NUMPY создаются отдельно, безопасно писать им из разных потоков.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top