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

Shell et commandes GNU Discussion :

Tâches en parallèle


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Par défaut Tâches en parallèle
    Bonsoir,

    Voici mon problème. J'ai un fichier contenant un grand nombre de liens URL (un par ligne). Je sais faire un programme qui, en utilisant cURL, va télécharger chacun de ces fichiers. Je veux en outre stocker le code HTTP de chaque téléchargement (je sais faire aussi) et le stocker dans un fichier. Là aussi, chaque ligne contiendra le code (200 etc.) avec le lien URL associé.

    En fait, j'aimerais faire cela en parallèle. C'est-à-dire lancer plusieurs téléchargements en même temps (bon, je sais que techniquement y en toujours qu'un qui se fait à la fois) pour rendre le traitement plus rapide. Je sais que cela peut se faire en rajoutant & à la fin de chaque appel. On peut faire une boucle qui appelle un certain nombre de fois le script (genre 5 ou 10 par boucle). Le problème se situe plutôt au niveau de la lecture et l'écriture : je ne veux pas que deux processus lisent la même ligne et que deux écrivent sur la même ligne.

    J'ai entendu parlé de la commande parallel mais en lisant la doc, je ne sais pas si elle gère ces problèmes de synchronisation.

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par Svengali48 Voir le message
    bon, je sais que techniquement y en toujours qu'un qui se fait à la fois
    ben... non. si tu parallélises tous les traitements sont réalisés en même temps (on parle du point de vue de l'application, pas du noyau ou du CPU) et la bande passante sera divisée d'autant

    Le problème se situe plutôt au niveau de la lecture et l'écriture : je ne veux pas que deux processus lisent la même ligne et que deux écrivent sur la même ligne.
    je crois que tu fais fausse route, il faut plutôt envisager ça sous cet angle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read url < fichier; do
       curl -s "$url" &
    done
    J'ai entendu parlé de la commande parallel mais (...)
    pareil j'en ai entendu parler, je l'ai quasiment jamais utilisé à vrai dire, arrivant toujours à me débattre avec les moyens du bord donc je saurai pas t'aider là dessus

    Edit: typiquement la commande xargs permet de paralléliser l'exécution des commandes elle aussi, un truc du genre serait peut-être à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat fichier | xargs -n1 -P5 -IURL curl "URL" &   # -P5 = 5 threads

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Par défaut
    Merci pour ta réponse.

    Le problème de ta boucle c'est que si le fichier fait 10 000 lignes, cela va donc lancer 10 000 processus en parallèle ... L'idéal serait de traiter disons 10 processus en parallèle, attendre qu'ils aient fini, puis lancer 10 autres etc. Mais le problème de l'écriture se pose toujours : je ne veux pas que deux processus écrivent sur la même ligne.

    Je vais voir du côté de xargs

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Bonjour,

    L'idéal serait de traiter disons 10 processus en parallèle, attendre qu'ils aient fini, puis lancer 10 autres etc
    il serait préférable de faire une "queue" contenant n (10, 20, tu choisiras) processus maximum.
    ainsi, si dans les n, il y en a un qui met trois plombes, d'autres pourront entrer dans la queue et être traités.

    edit:
    un truc comme ça
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    n=10 #par exemple
    while read line
    do
            until (($(jobs -p | wc -l) < n )); do sleep 1; done
            :do whatever whith line in background &
    don < fichier
    la lecture du fichier sera toujours séquentielle.
    le problème des travaux en arrière-plan, c'est l'écriture dans un fichier.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 23
    Par défaut
    Merci pour l'astuce !

    Pour l'écriture dans un fichier, faut utiliser les "locks" ou bien y a une commande toute faite pour gérer ça ?

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    Bonjour

    La documentation de GNU parallel est très bien faite et explicite. Parallel est un xargs amélioré. Lire la section "DIFFERENCES BETWEEN xargs AND GNU Parallel".

Discussions similaires

  1. [Tools] Exécutions des tâches en parallèle
    Par ELKamel dans le forum Spring
    Réponses: 1
    Dernier message: 27/03/2013, 15h56
  2. [SP-2010] Inserer Tache dans flux de travail SP Designer ajoute une tâche en parallèle
    Par Mihnea Niculescu dans le forum SharePoint
    Réponses: 0
    Dernier message: 20/03/2012, 19h56
  3. tâches en parallèle [Timer]
    Par zakarota dans le forum Général Java
    Réponses: 6
    Dernier message: 20/07/2011, 12h09
  4. Executer des tâches en parallèle [Timer]
    Par zakarota dans le forum Général Java
    Réponses: 1
    Dernier message: 06/07/2011, 14h01
  5. Réponses: 2
    Dernier message: 18/06/2009, 09h30

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