python - liberación de la función f2py GIL
numpy documentation (1)
¿Se libera Global Interpretter Lock (GIL) cuando llamo a una función envuelta f2py?
(Estoy feliz de tratar de descubrir por mi cuenta, pero no estoy lo suficientemente familiarizado con la fuente numpy para saber por dónde empezar a buscar) ...
Para aclarar, una buena respuesta a esta pregunta me ayudaría a saber en qué parte de la fuente numpy buscar un Py_BEGIN_ALLOW_THREADS
o simplemente me Py_BEGIN_ALLOW_THREADS
si se publica el GIL (preferiblemente con alguna evidencia).
No, f2py no puede dejar el GIL en su lugar. Sin embargo, puede liberar el GIL agregando la directiva de threadsafe
.
ejemplo:
subroutine foo(a)
!f2py threadsafe
!f2py intent(out) :: a
integer a
a = 5
end subroutine foo
Ahora compilarlo:
f2py -c -m foo --build-dir test_build foo.f90
Y podemos verificar el código fuente:
grep THREAD test_build/src.*/*.c
build/src.linux-x86_64-2.7/testmodule.c: Py_BEGIN_ALLOW_THREADS
build/src.linux-x86_64-2.7/testmodule.c: Py_END_ALLOW_THREADS
Sin embargo, si repetimos el proceso eliminando la línea de !f2py threadsafe
de !f2py threadsafe
, entonces las macros para liberar el GIL no están incluidas.