2 votes

comment instancier pybind11::array_t dans un thread séparé

Dans pybind11-wrapped c++, appelé à partir de python, je peux faire ceci :

py::array_t<double> t1 = py::array_t<double>(3);

Mais si je fais cela dans un thread séparé, il se plante avec une erreur de segmentation (en fait, il semble se planter quand t1 sort de la portée ou est détruit).

Je peux résoudre ce problème en procédant comme suit

PyGILState_STATE gstate;
gstate = PyGILState_Ensure();

pybind11::array_t<double> t1 = pybind11::array_t<double>(3)

PyGILState_Release(gstate);

Il est donc évident qu'il y a des choses qui dépendent de la GIL dans pybind11::array_t. Est-ce nécessairement le cas ? Dois-je acquérir la GIL pour l'instancier ?

2voto

Sergei Points 450

Oui, le GIL est obligatoire.

Lorsque vous créez un objet python, vous interagissez avec l'interpréteur python. À un moment donné du processus, vous devez acquérir GIL pour le faire droit .

Cela dit, la création de pybind11::array_t pourrait comporter une partie coûteuse qui ne nécessite pas de GIL et qui pourrait être traitée dans un autre fil. Par exemple, vous pouvez allouer et initialiser des données brutes et les passer à pybind11::array_t pour créer rapidement un objet avec GIL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X