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 :

Problème récupération de données socket via Thread [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème récupération de données socket via Thread
    Bonjour,

    J'aimerai avoir de l'aide sur le code suivant.
    Celui-ci fonctionne bien mais une seule fois... c'est embêtant pour un Thread.
    J'ai identifié que le soucis vient du return du Thread readData.
    Si je remplace l'expression return data par print(data), le serveur affichera la donnée reçue à chaque fois.
    Par contre, si je laisse return ça fonctionne qu'une fois et je n'ai pas de message d'erreur ou autre...

    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
     
    import socket
    from multiprocessing.pool import ThreadPool
     
    def readData(conn):
        while True:
            try:
                data = conn.recv(1024).decode("utf8")
                return data
            except Exception as e:
                print(F"Erreur : {e}")
     
    #------------------
    host, port = ('192.168.1.101',2000)
     
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.bind((host,port))
    socket.listen(5)
    print('Serveur lancé...')
     
    while True:
        try:
            conn, address = socket.accept()
            print('Client connecté ', address)
     
            pool = ThreadPool(processes=1)
            async_result = pool.apply_async(readData, (conn,))
     
            return_val = async_result.get()  
            print(return_val)
     
        except Exception as e:
            print(F"Erreur : {e}")
    J'ai passé un temps fou à essayer de comprendre mais là je suis sec...
    Merci par avance de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    mutliprocessing, c'est pour avoir des activités asynchrones construites avec des process et non avec des Threads.

    Si l'activité est matérialisée par une fonction i.e. on passe par "def toto" pour définir la séquence d'instructions qui seront exécutées par l'activité portée par un processus ou thread.

    Ce n'est plus une fonction à proprement parler: elle est appelée indirectement par la machine à créer thread/process qui elle va appeler cette "fonction" et lorsqu'elle se termine, le (thread ou process) qui la porte se termine aussi.

    Normal dans ces conditions que return termine l'activité (et processus/thread).

    Par contre, sans "return", async_result.get() attend indéfiniment que l'activité se termine pour récupérer les données retournées via "return".

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    wiztricks merci pour cette réponse rapide.
    Je voulais utiliser cette méthode car je ne voulais pas créer une classe readData qui aurait une variable global.
    Je ne trouve pas ça top.

    Je pense qu'il doit y avoir une méthode approprié pour les sockets mais tous les exemples que je trouve, finissent par print(message)...

    Y'a t-il quelque chose que je rate?

    Merci d'avance

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Zakche Voir le message
    Y'a t-il quelque chose que je rate?
    Ce que vous ratez est qu'en découper votre code en activités n'apporte rien si elles ne coopèrent pas i.e une activité produit des informations qui pourront être consommées par d'autres.

    C'est sûr qu'on n'a pas ce soucis avez les fonctions "simples" puisqu'on part d'une sorte de hiérarchie intrinsèque où on a un appelant qui appelle une fonction pour réaliser une opération et qui attend le retour du résultat pour continuer.

    Le "return" dans votre code fait juste çà de façon compliquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             async_result = pool.apply_async(readData, (conn,)) 
            return_val = async_result.get()
    vous lancez la fonction readData via la création d'un processus puis vous attendez qu'elle se termine pour récupérer les données.

    Autant écrire directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        result = readData(conn)
    Et si vous voulez avoir un processus qui lise les données en permanence, pas la peine d'exécuter pool.apply_async(readData, (conn,)) dans une boucle! Vous créez une tache qui se terminera lorsque la socket est fermée et qui pousse les messages qu'elle récupère dans une Queue qui sera vidée par une autre activité.

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci.

    Je vais du coup me documenter sur l'objet Queue.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème récupération de données en liaison série
    Par prison_break dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/06/2007, 08h51
  2. [VB6] Problème récupération de données
    Par valie dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 29/08/2006, 12h36
  3. problème récupération de données dans des fichiers .DAT
    Par indymontpellier dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/04/2006, 07h54
  4. [MySQL] Problème récupération de données avec un SELECT DISTINCT
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2005, 14h48
  5. [Débutant] Problème récupération de données
    Par flogreg dans le forum Servlets/JSP
    Réponses: 26
    Dernier message: 20/08/2004, 17h29

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