Multi-Threading en C par Python

Discutez d'informatique ici !
Kvas²
Membre Naturel
Messages: 23
Enregistré le: 20 Juin 2012, 12:35

Multi-Threading en C par Python

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.



Avatar de l’utilisateur
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.

Avatar de l’utilisateur
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

Avatar de l’utilisateur
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 l’interpré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.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite