Каковы последствия вызова функций API Numpy C API из нескольких нитей?
-
08-10-2019 - |
Вопрос
Это рискованный бизнес, и я понимаю, что глобальный переводчик является грозным врагом параллелизма. Однако, если я использую 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
Безопасен в потоке.
PyArray_DATA
определяется в ndarrayobject.h:#define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
Тип структуры PyarrayObject определяется в том же файле; Область интереса:
char *data;
Так что теперь вопрос заключается в том, является ли доступ к доступу
data
Из нескольких потоков безопасны или нет.Создание нового множества массива с нуля (т. Е. Не получение его из существующей структуры данных) проходит
NULL
указатель данных наPyArray_NewFromDescr
, определенный в arrayobject.c.Это вызывает
PyArray_NewFromDescr
вызыватьPyDataMem_NEW
Для того, чтобы распределить память для PyarrayObject'sdata
поле. Это просто макрос для Malloc:#define PyDataMem_NEW(size) ((char *)malloc(size))
В итоге, PyArray_DATA
Безопасен в потоке и до тех пор, пока баллы NUMPY создаются отдельно, безопасно писать им из разных потоков.