Multi-Threading en C par Python
Discutez d'informatique ici !
-
Kvas²
- Membre Naturel
- Messages: 23
- Enregistré le: 20 Juin 2012, 12:35
-
par Kvas² » 23 Mai 2013, 12:06
Bonjour,
Je rencontre quelques difficultés d'implementations en C er Python. En effet, j'aimerai ecrire un programme C/C++ qui lancera plusieurs threads. Le hic reside dans la fonction à exécuter par chaque Thread. Cette fonction est disponible en Python et le temps de réecriture sera evidemment super long.
Voici un extrait du code C++ que je propose pour resoudre ce problème:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define K 10
pthread_t *tids ;
int i;
void *status ;
pthread_attr_t att ;
void load_data(){}
void cut_data_4_cross_validation(){}
void* build_model(void* i)
{
int j = (int)i;
printf("Model number %i\n",j);
ifstream fichier("build_model.py");
if (fichier.fail()) {
cout << "Fichier de script introuvable : " << "build_model.py" <<"\n";
return 0;
}
else
printf("%d : Fichier trouvé !!!! \n",j);
FILE* pyFile = fopen("build_model.py", "r");
//PyRun_SimpleString( "print \"Simple commande python d'écriture\"");
PyRun_AnyFile(pyFile, "build_model.py");
return i;
}
int main(int argc, char* argv[])
{
load_data();
cut_data_4_cross_validation();
tids = (pthread_t *) malloc (sizeof(pthread_t) * K) ;
for(i=0; i {
pthread_create (&tids [i], NULL, build_model, (int *)i) ;
}
for(i=0; i pthread_join (tids[i], &status) ;
printf("\n\nTout beigne!!\n");
return 0;
}
Ce programme génère une erreur de segmentation que j'ai du mal à comprendre. Voici les résultats de l'exécution:
Model number 0
Model number 1
Model number 2
Model number 3
Model number 4
Model number 5
Model number 6
Model number 9
Model number 8
Model number 7
0 : Fichier trouvé !!!!
2 : Fichier trouvé !!!!
5 : Fichier trouvé !!!!
6 : Fichier trouvé !!!!
1 : Fichier trouvé !!!!
Erreur de segmentation (core dumped)
Je reste ouverte à toute proposition allant dans le sens de la résolution de ce problème.
Merci.
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 07:03
-
par ampholyte » 23 Mai 2013, 12:30
Bonjour,
As-tu essayé d'utiliser gdb et valgrind sur ton programme pour voir d'où peut provenir ton erreur ?
De plus pourquoi utiliser un ifstream si derrière tu utilises un fopen.
- Code: Tout sélectionner
void* build_model(void* i) {
int j = (int)i;
FILE *file;
printf("Model number %i\n",j);
if ((file = fopen("build_model.py", "r")) == NULL) {
printf("Fichier de script introuvable build_model.py\n");
return 0;
}
printf("%d : Fichier trouvé !!!!\n", i);
PyRun_AnyFile(file, "build_model.py");
fclose(file);
return i;
}
-
Kvas²
- Membre Naturel
- Messages: 23
- Enregistré le: 20 Juin 2012, 12:35
-
par Kvas² » 23 Mai 2013, 13:19
Justement
C'est l'instruction
- Code: Tout sélectionner
PyRun_AnyFile(pyFile, "build_model.py")
qui génère cette erreur car sans elle le programme se deroule sans problème.
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 07:03
-
par ampholyte » 23 Mai 2013, 13:29
Je viens de le remarquer mais essaye de rajouter un fclose(file) après la fonction PyRun.
Si tu utilises gdb peux-tu essayer de voir à quel moment précis (dans la fonction PyRun) le code plante ?
-
Kvas²
- Membre Naturel
- Messages: 23
- Enregistré le: 20 Juin 2012, 12:35
-
par Kvas² » 23 Mai 2013, 13:45
ampholyte a écrit:Je viens de le remarquer mais essaye de rajouter un fclose(file) après la fonction PyRun.
Pas de changement dans l'execution lorsqu'on ajoute la fermeture du fichier.
Si tu utilises gdb peux-tu essayer de voir à quel moment précis (dans la fonction PyRun) le code plante ?
Pour le code appelé dans PYRun, il n'y a qu'une instruction un print ( je ne pense pas que ce soit cette instruction le problème). De plus, l'utilisation d'un fichier vide pour Build_model génère toujours cette erreur de segmentation
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 07:03
-
par ampholyte » 23 Mai 2013, 14:26
Kvas² a écrit:Pour le code appelé dans PYRun, il n'y a qu'une instruction un print ( je ne pense pas que ce soit cette instruction le problème). De plus, l'utilisation d'un fichier vide pour Build_model génère toujours cette erreur de segmentation
Je ne voulais pas parler de l'information contenue dans Build_model mais la fonction PyRun_AnyFile à l'air d'appeler plusieurs fonctions différentes notamment :
- PyRun_AnyFile
- PyRun_AnyFileExFlags
- PyRun_SimpleFile
- PyRun_SimpleFileExFlags()
Pourquoi appeles-tu la fonction PyRun_AnyFile ?
Pourquoi ne pas appeler directement PyRun_SimpleFile ?
Sources :
http://docs.python.org/2/c-api/veryhigh.html
-
LeJeu
- Membre Irrationnel
- Messages: 1142
- Enregistré le: 24 Jan 2010, 21:52
-
par LeJeu » 23 Mai 2013, 20:10
Kvas² a écrit:Bonjour,
Je rencontre quelques difficultés d'implementations en C er Python.
Je reste ouverte à toute proposition allant dans le sens de la résolution de ce problème.
Merci.
Salut,
Je dirais : rien d"étonnant que ça ne marche pas ( du premier coup) , car rien ne dit que linterpréteur Python soit MultiThreadable , il semblerait que non ...
Un fonction n'est pas multithreadable par exemple quand elle utilise des ressources 'globales', il faut alors utiliser des mutex / des locks pour que chaque instance n'écrabouille pas les ressources de l'autre
En gros ca veut dire que ton programme en C va mettre les appels à Python à la queue leu-leu.... et que le multithreading ne vas pas servir à grand chose, en tous cas pas à aller plus vite

Je t'ai trouvé un article :
Embedding Python in Multi-Threaded C/C++ Applications qui me semble te donner la façon de faire
(ceci dit sans connaitre le Python...)
-
Kvas²
- Membre Naturel
- Messages: 23
- Enregistré le: 20 Juin 2012, 12:35
-
par Kvas² » 24 Mai 2013, 16:13
ampholyte a écrit:Je ne voulais pas parler de l'information contenue dans Build_model mais la fonction PyRun_AnyFile à l'air d'appeler plusieurs fonctions différentes notamment :
- PyRun_AnyFile
- PyRun_AnyFileExFlags
- PyRun_SimpleFile
- PyRun_SimpleFileExFlags()
Pourquoi appeles-tu la fonction PyRun_AnyFile ?
Pourquoi ne pas appeler directement PyRun_SimpleFile ?
Sources :
http://docs.python.org/2/c-api/veryhigh.html
Merci de tes suggestions. Je vais essayer d'en faire usage mais en attendant, j'ai ecrit hier la version parallèle en python.
Je vous tiens informé de mon evolution.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité