IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Ordonnancement de traitements


Sujet :

Python

  1. #1
    Membre confirmé Avatar de memento80
    Homme Profil pro
    Boulot : ne rentre pas dans une case
    Inscrit en
    Novembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Boulot : ne rentre pas dans une case
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2004
    Messages : 163
    Par défaut Ordonnancement de traitements
    Bonjour,

    Je m'essaie à créer un ordonnanceur en Python permettant d'exécuter d'autres programmes python.
    Le but est de pouvoir lancer un ensemble de traitements et de gérer les dépendances entre chaque.

    Un exemple :
    5 traitements : A, B, C, D et E
    B doit attendre que A se termine correctement.
    C doit attendre que A se termine correctement.
    D doit attendre que B et C se terminent correctement.
    E doit attendre que B et C se terminent correctement.

    En théorie, je dois donc pouvoir tout exécuter en même temps et l'ordonnanceur doit se débrouiller avec les dépendances que je donne entre les traitements.
    Bien sur, il doit pouvoir exécuter des traitements en parallèle.

    Je ne sais pas exactement si cet outil a déjà été réalisé. J'ai vaguement recherché.. J'ai bien trouvé des choses pour remplacer la crontab mais, ce n'est pas vraiment ce que je cherche, et rien qui gérait les dépendances entre traitements. Si je me trompe, n'hésitez pas.
    Toujours est-il, qu'existant ou pas, l'exercice m'intéressait.

    J'ai bien réalisé quelque chose mais au prix de quelques points négatifs, probablement dû aux limites de mes connaissances. Et je cherche à savoir s'il y a moyen d'améliorer le système.

    Je commence donc mon traitement par là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    listTrait = [1, 2, 3, 4, 5]
    dictTrait = {1: 'Test_A.py', 2: 'Test_B.py', 3: 'Test_C.py', 4: 'Test_D.py', 5: 'Test_E.py'}
    dictDep = {1: [], 2: [1], 3: [1], 4: [2, 3], 5: [2, 3]}
     
    future = {}
    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
        for numTrait in listTrait: # Pour chaque traitement
            future[numTrait] = executor.submit(fctExecTrait, dictTrait[numTrait], dictDep[numTrait], dictTrait, cr_fic)
    Ceci me permet donc de jouer sur 4 threads et donc d'exécuter jusqu'à 4 traitements en parallèle, préalablement initialisés dans la liste "listTrait".
    Ces traitements sont donc lancés par l'intermédiaire de la fonction "fctExecTrait" avec en argument, entre autre, les dépendances dans le dictionnaire "dictDep" (contenant B attend A, C attend A ... ect..).

    Commande utilisée dans la fonction "fctExecTrait" pour exécuter le script python du traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    codeRetour = subprocess.call((['{0}'.format(execPython), '{0}'.format(nomScript)])) # Exécution du traitement et récupération du code retour
    Là où ça commence à pêcher, c'est dans la fonction "fctExecTrait", avant d'exécuter le traitement, pour déterminer si un prédecesseur a bien été exécuté ou n'est pas terminé.
    Pour l'instant, je n'ai rien trouvé de mieux que de créer un fichier "flag" à la fin de chacun des traitements permettant de dire "OK moi traitement X, j'ai bien terminé".
    Ainsi, chaque traitement va regarder dans le dictionnaire dictDep ce qu'il a besoin d'attendre, va vérifier si les fichiers flag correspondant sont présents. Si oui, alors il s'exécute sinon.... il ne s'exécute pas et va revérifier plus tard.
    Et cette vérification de dépendances va se faire toutes les 5 sedondes à l'aide d'un boucle while et d'une temporisation de 5 secondes dans cette boucle.
    Pour le moment, j'ai déterminé un nombre limite de vérifications des dépendances pour que le traitement dise ainsi "j'ai vérifié 20 fois les dépendances, toutes les 5 secondes, j'arrête car je pense que ça n'a pas du bien se terminer en amont".

    Voilà. J'espère avoir été suffisamment clair.
    Si vous avez des avis/pistes pour améliorer en fonction de ce que permet Python, je suis preneur.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par memento80 Voir le message
    Si vous avez des avis/pistes pour améliorer en fonction de ce que permet Python, je suis preneur.
    "python dependency scheduler" sont les mots clefs à utiliser pour récupérer ce qui existe grâce à votre moteur de recherche préféré. Vous allez y trouver des bibliothèques prêtes à l'emploi et... si elles ne conviennent pas, la lecture des codes pourrait être source d'inspiration.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par memento80 Voir le message
    Si vous avez des avis/pistes pour améliorer en fonction de ce que permet Python, je suis preneur.
    Juste une idée (ou plutôt deux ;-) ).

    Savoir dans quel ordre prendre un ensemble de tâches avec, pour certaines d'entre elles, des précédents à satisfaire avant, se rencontre dans les méthodes de planification (PERT ou MPM). Par exemple, https://fr.wikipedia.org/wiki/PERT. Dans la mesure où on n'utilise pas un programme tout fait, il y a probablement des algorithmes à étudier et à transposer, en sachant que ce sera plus simple puisqu'il n'y a pas durée à gérer.

    On peut aussi faire autrement. Ce qui est décrit me fait penser à un petit travail que j'ai fait il a quelques temps: http://python.jpvweb.com/mesrecettes...d_tableaublanc. Il s'agissait de coordonner plusieurs threads qui devaient aller chercher eux-mêmes du travail sur un "tableau blanc". Ce tableau contenait les objets représentant le travail, et pouvait être lus et écrits par n'importe quel thread. Le travail était ajouté sur le tableau blanc par le programme principal, et celui-ci pouvait aussi piloter le bon déroulement des opérations (ex: évaluer la situation et ajouter ou retirer des threads) et "effacer" les travaux terminés. Dans cette logique, ajouter et tenir compte de précédents à satisfaire devraient être faciles à mettre en œuvre.

  4. #4
    Membre confirmé Avatar de memento80
    Homme Profil pro
    Boulot : ne rentre pas dans une case
    Inscrit en
    Novembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Boulot : ne rentre pas dans une case
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2004
    Messages : 163
    Par défaut
    Citation Envoyé par wiztricks
    "python dependency scheduler" sont les mots clefs à utiliser pour récupérer ce qui existe grâce à votre moteur de recherche préféré. Vous allez y trouver des bibliothèques prêtes à l'emploi et... si elles ne conviennent pas, la lecture des codes pourrait être source d'inspiration.
    Oui, j'avais quand même fait quelques recherches avant... mais ça commence à dater et j'avais complètement oublié entre autre pyScheduler qui, sur le papier, semble gérer les dépendances.
    J'avais mis de côté cet outil car, après hésitation, je préférais tenter de me faire un outil, plus "léger", sur mesure et surtout plus maîtrisable en connaissant le code derrière.
    Ca a le mérite de me rafraichir la mémoire.
    Par contre, je viens de voir que "mon moteur de recherche préféré" ne m'a pas donné exactement les mêmes résultats qu'un autre moteur de recherche "moins préféré" pour moi. J'ai donc d'autres pistes à explorer en provenance.. d'autres forums..

    Par contre, étudier le code d'un autre outil, sans commentaire, pour quelqu'un qui maîtrise sur le bout des doigts, ça peut être intéressant, mais pour moi... j'en ai pour des jours.

    Citation Envoyé par tyrtamos
    Savoir dans quel ordre prendre un ensemble de tâches avec, pour certaines d'entre elles, des précédents à satisfaire avant, se rencontre dans les méthodes de planification (PERT ou MPM). Par exemple, https://fr.wikipedia.org/wiki/PERT. Dans la mesure où on n'utilise pas un programme tout fait, il y a probablement des algorithmes à étudier et à transposer, en sachant que ce sera plus simple puisqu'il n'y a pas durée à gérer.
    Ah oui, tiens.. Le parallèle est intéressant. Je ne domine pas trop le sujet de PERT & Cie mais ça mérite d'être creusé.

    Citation Envoyé par tyrtamos
    On peut aussi faire autrement. Ce qui est décrit me fait penser à un petit travail que j'ai fait il a quelques temps: http://python.jpvweb.com/mesrecettes...d_tableaublanc. Il s'agissait de coordonner plusieurs threads qui devaient aller chercher eux-mêmes du travail sur un "tableau blanc". Ce tableau contenait les objets représentant le travail, et pouvait être lus et écrits par n'importe quel thread. Le travail était ajouté sur le tableau blanc par le programme principal, et celui-ci pouvait aussi piloter le bon déroulement des opérations (ex: évaluer la situation et ajouter ou retirer des threads) et "effacer" les travaux terminés. Dans cette logique, ajouter et tenir compte de précédents à satisfaire devraient être faciles à mettre en œuvre.
    Très intéressant effectivement. Je vais aussi regarder ça en détail.

    Merci pour ces informations.
    Le sujet n'est pas très urgent, je vais regarder tout ça tranquillement à tête reposée dès que j'en aurais l'occasion.
    Je risque donc de revenir plus tard si j'ai d'autres questions.
    ... et si d'autres idées en attendant, je ne dis jamais non.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par memento80 Voir le message
    Par contre, étudier le code d'un autre outil, sans commentaire, pour quelqu'un qui maîtrise sur le bout des doigts, ça peut être intéressant, mais pour moi... j'en ai pour des jours.
    Le module principal de PyScheduler (serialScheduler.py) ne fait que 173 lignes, la moitié sont des commentaires, ...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre confirmé Avatar de memento80
    Homme Profil pro
    Boulot : ne rentre pas dans une case
    Inscrit en
    Novembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Boulot : ne rentre pas dans une case
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2004
    Messages : 163
    Par défaut
    Citation Envoyé par wiztricks
    Le module principal de PyScheduler (serialScheduler.py) ne fait que 173 lignes, la moitié sont des commentaires, ...
    Je ne me rappelle pas qu'il était aussi... court. Comme j'ai dit, ça date un peu et j'ai du confondre avec ce que j'ai vu sur d'autres sources (un outil qui remplaçait la crontab ? ou autre.. ?).
    Je me pencherai à nouveau dessus.

    Si j'arrive à me dédier un certain temps en continu sur ce sujet, j'arriverai peut-être à avancer un peu plus sérieusement là-dessus..

Discussions similaires

  1. [XL-2003] Algorythme d'ordonnancement des traitements
    Par Mikadox dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 29/06/2012, 13h42
  2. Durée d'un traitement temps réel
    Par Almex dans le forum C
    Réponses: 5
    Dernier message: 29/03/2003, 14h15
  3. [directsound] boucle de traitement de son
    Par gargle dans le forum DirectX
    Réponses: 5
    Dernier message: 24/03/2003, 10h47
  4. Traitement d'un char* renvoyé par une DLL en C++
    Par LuluTchab dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2003, 21h48
  5. Rafraichissement de la fenetre pendant le traitement
    Par Bobx dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/02/2003, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo