J'ai une application C ++ qui utilise un interprète python incorporé avec l'API Python C. Il peut évaluer les fichiers python et le code source avec pyrun_simplefile et pyobject_callMethod.
Maintenant, j'ai un code source Python qui a un fil de fil de python qui se termine dans la sous-classes filetage.thread et a une nouvelle ré-implémentation: P>
import time
from threading import Thread
class MyThread(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
while True:
print "running..."
time.sleep(0.2)
3 Réponses :
Quel est le fil principal? Est-ce simplement renvoyé le contrôle à votre application C ++? Si tel est le cas, n'oubliez pas de libérer le gil (verrouillage de l'interpréteur global) lorsque vous n'exécutant aucun code Python dans votre fil principal, sinon vos autres fils de python étalent en attendant que le gil soit libéré. P>
Le moyen le plus simple de le faire est d'utiliser les macros py_begin_allow_threads / py_end_allow_threads. p>
Voir le DOC à: http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock P>
J'ai eu le même problème similaire et j'ai trouvé la solution. Je sais que le fil est assez vieux mais tout le monde se demande ... Voici un échantillon de code qui fait ce dont vous avez besoin.
#include <Python.h>
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
int main()
{
std::string script =
"import time, threading \n"
""
"def job(): \n"
" while True: \n"
" print('Python') \n"
" time.sleep(1) \n"
""
"t = threading.Thread(target=job, args = ()) \n"
"t.daemon = True \n"
"t.start() \n";
PyEval_InitThreads();
Py_Initialize();
PyRun_SimpleString(script.c_str());
Py_BEGIN_ALLOW_THREADS
while(true)
{
std::cout << "C++" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
Py_END_ALLOW_THREADS
Py_Finalize();
return 0;
}
Bien que ce fil soit vieux, je pense que ma réponse pourrait être utile pour d'autres personnes qui rencontrent le même problème.
J'ai couru dans le même problème il y a deux jours, j'ai googlé et j'ai trouvé ce fil, mais pas de chance avec @ La solution de Reuille. P>
J'aimerais maintenant partager une solution de contournement que j'ai trouvée maintenant: vous devez exécuter p> dans vos scripts Python au lieu de votre fonction principale C ++.
C'est un bug étrange. P> edit fort>: vous pouvez voir les détails de mon correctif sur mon Projet . P> P>
Juste un chèque: comment appelez-vous votre fil?
J'ai une réponse à une question similaire à ici