Uma maneira conveniente de fazer isso automaticamente é usar o sys._is_gil_enabled()
método para verificar se a macro precisa ser usada. Uma receita como esta pode funcionar:
macros = ()
if getattr(sys, "_is_gil_enabled", None) and not sys._is_gil_enabled():
macros = (("Py_GIL_DISABLED","1"))
ext_modules = (
Extension(
"compute",
("compute.pyx"),
define_macros=macros
)
)
4. Certifique-se de que seu código seja thread-safe
A segurança dos threads nos módulos Cython sempre foi responsabilidade do programador, pelo menos no que diz respeito ao código C puro. Se você chamar o interpretador CPython usando Cython, mesmo na construção de thread livre, o interpretador manipulará contagens de referência para esses objetos (embora não faça nada sobre corridas de dados). Mas quaisquer funções do Cython executadas simultaneamente não devem manipular os mesmos dados.
Novas anotações de tipo para constantes, ponteiros e valores voláteis
À medida que o Cython evoluiu, ele gradualmente se afastou de sua sintaxe Python personalizada, mas não exatamente. O Cython moderno usa uma sintaxe que é essencialmente Python regular com dicas de tipo adicionadas ao Cython, gerenciadores de contexto e outras construções.