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 :

Envoi cadencé de trames


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Par défaut Envoi cadencé de trames
    Bonjour à tous,
    je débute en Python et on me demande d'envoyer des trames ethernet à intervalle régulier mais court (de l'ordre du centième de seconde).
    Je cherche la meilleure solution (évidemment!).
    J'ai utilisé un time.sleep(tempo) mais mon problème est que la préparation de la trame (calculs...) avant de faire le sendMsg prend un temps non négligeable vis à vis de la tempo.
    L'idéal serait que cette préparation se fasse en temps masqué pendant l'attente de la tempo.
    Merci pour votre aide
    Begude

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    Bonjour,

    je verrais une utilisation du module threading et queue.

    1 thread qui alimente la queue
    1 thread qui prend un message de la queue et qui se met en pause pdt une seconde.

  3. #3
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonsoir,
    vous avez également la possibilité te chronométré le temps de traitement, préparation du message, et d'en tenir compte dans le "sleep".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tempo = 0.1
    t1 = time()
    #traitement...
    t2 = time()
    sleep(tempo-(t2-t1))
    #envoi du message
    Bien entendu, le temps de traitement doit être inférieur au tempo.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Un exemple qui suit le modèle proposé par kango.
    J'en ai profité pour définir une classe Every, qui fonctionne comme Timer mais répète l'appel tant qu'on n'appelle pas la méthode cancel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    from threading import _Timer
    from queue import Queue, Empty
     
    class Every(_Timer):
        def run(self):
            self.finished.wait(self.interval)
            while not self.finished.is_set():
                self.function(*self.args, **self.kwargs)
                self.finished.wait(self.interval)
     
    def send(q):
        try:
            frame = q.get_nowait()
            q.task_done()
            print("frame sent:", frame)
        except Empty:
            pass
     
    q = Queue()
    e = Every(0.5, send, (q,))
    e.start()
     
    for i in range(10):
        q.put(i)
     
    q.join()
    e.cancel()
    [EDIT] gestion de l'arrêt de l'envoi dans l'exemple
    Ce code est pour Python 3; en Python 2.x, le module queue s'appelle Queue (avec une majuscule)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Par défaut
    Merci à tous pour vos réponses,
    je ne dormais pas mais je suis en train de traiter une autre demande...
    Je vais regarder de près le code de dividee.
    Je ne connaissais pas la classe Queue et je débute dans les Thread
    J'ai du pain sur la planche.
    @+
    Begude

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Par défaut
    J'ai fait quelques tests avec le code de dividee dans lequel j'ai mis qq commentaires et un enregistrement de l'heure de "l'envoi".
    Si l'interval est à 0.5, pas de souci :
    2011-08-25 14:31:00.397000 frame sent: 0
    2011-08-25 14:31:00.897000 frame sent: 1
    2011-08-25 14:31:01.397000 frame sent: 2
    2011-08-25 14:31:01.897000 frame sent: 3
    2011-08-25 14:31:02.397000 frame sent: 4
    2011-08-25 14:31:02.897000 frame sent: 5
    2011-08-25 14:31:03.397000 frame sent: 6
    2011-08-25 14:31:03.897000 frame sent: 7
    2011-08-25 14:31:04.397000 frame sent: 8
    2011-08-25 14:31:04.897000 frame sent: 9
    par contre, si je descends à 0.1, l'écart mesuré est plutôt à 0.11
    2011-08-25 14:32:02.553000 frame sent: 0
    2011-08-25 14:32:02.662000 frame sent: 1
    2011-08-25 14:32:02.772000 frame sent: 2
    2011-08-25 14:32:02.881000 frame sent: 3
    2011-08-25 14:32:02.990000 frame sent: 4
    2011-08-25 14:32:03.100000 frame sent: 5
    2011-08-25 14:32:03.209000 frame sent: 6
    2011-08-25 14:32:03.319000 frame sent: 7
    2011-08-25 14:32:03.428000 frame sent: 8
    2011-08-25 14:32:03.537000 frame sent: 9
    Je pensais que l'on pouvait attendre une meilleure précision jusqu'à des intervalles de qq centième au vu de ce qu'il y a d'executé dans "send".
    Qu'en pensez vous ?

    Begude

    PS : Je remets le code utilisé pour les tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    # -*- coding: utf-8 -*-
    from threading import _Timer
    from Queue import Queue, Empty
    import time
    import datetime
     
    class Every(_Timer):
        def run(self):
            self.finished.wait(self.interval)
            while not self.finished.is_set():
                self.function(*self.args, **self.kwargs)
                self.finished.wait(self.interval)
     
    def send(q, lst):
        try:
            # renvoie un element de la queue et le supprime de la queue
            frame = q.get_nowait() 
     
            lst.append( "%s frame sent: %s" % (datetime.datetime.now(), frame) )
     
            # indique que la tache dans la queue a ete terminee
            q.task_done()
     
        except Empty:
            # si la queue est vide
            pass
     
    # queue FIFO
    q = Queue()
     
    lst = []
    e = Every(0.1, send, (q,lst))
    e.start()
     
    for i in range(10):
        # place i dans la queue
        q.put(i)
     
    # bloque jusqu'a ce que tous les elements de la queue aient ete traites
    q.join()
     
    e.cancel()
     
    for l in lst:
        print l

Discussions similaires

  1. Envoi d'une trame ethernet
    Par Sékiltoyai dans le forum Réseau
    Réponses: 4
    Dernier message: 22/03/2009, 16h51
  2. Réponses: 5
    Dernier message: 28/09/2007, 09h52
  3. [Réseau] Connexion et envoie d'une trame
    Par ivanoe25 dans le forum Langage
    Réponses: 10
    Dernier message: 29/09/2006, 00h04
  4. Problème avec l'envoi d'une trame TCP
    Par fredoBreton dans le forum API, COM et SDKs
    Réponses: 14
    Dernier message: 17/11/2005, 20h19

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