Рекомендуется обернуть чистые C функции, которые блокируют ввод-вывод, или даже чистые C функции, которые проводят значительное время в ЦП, в Py_BEGIN_ALLOW_THREADS
и Py_END_ALLOW_THREADS
блоках.
Есть ли какие-либо вред, нанесенный в значительной степени всем чистым C функциям (с чистыми C аргументами - без Python объектов API), независимо от того, блокируется ли он на IO или ЦП в течение длительного времени, с Py_BEGIN_ALLOW_THREADS
и Py_END_ALLOW_THREADS
?
Например, скажем, у вас была следующая функция, где some_pure_c_non_io_func
тратит небольшое время на задачу процессора. Есть ли какой-либо вред в освобождении GIL здесь?
static PyObject Foo_bar(Foo *self, PyObject *args, PyObject *kwargs)
{
int i = 0;
if (!PyArg_ParseTuple(args, "i", &i)) {
return NULL;
}
Py_BEGIN_ALLOW_THREADS
some_pure_c_non_io_func(i);
Py_END_ALLOW_THREADS
Py_RETURN_NONE;
}