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 :

Multi Thread, httpServer, methode serve_forever, DO_GET et Queue


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Points : 32
    Points
    32
    Par défaut Multi Thread, httpServer, methode serve_forever, DO_GET et Queue
    Bonjour à tous,

    J'avoue qu'ici je suis bien bien bloqué !
    J'ai une raspberry pi, executant un script en python, et censé faire l'interface entre une arduino et un serveur (je précise que l'interface pi->arduino est implémenté et fonctionnel).

    J'essaie à présent de faire l'interface entre mon serveur et la pi...
    J'initialise donc mon serveur (sur la raspberry pi) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def init_serveur():
    	PORT = 8080
     
    	Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
    	#Handler = Handler_perso
     
     
    	httpd = SocketServer.TCPServer(("", PORT), MyHandler)
    	print "serving at port", PORT
    	return httpd
    puis je lance un nouveau thread dans lequel j'appelle la méthode "serve_forever"

    (mon main)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        t_serveur=thread_serveur(httpd)
        t_serveur.daemon=True
        t_serveur.start()
    (ma classe thread)
    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
    class thread_serveur(Thread):
     
        def __init__(self, httpd):
            Thread.__init__(self)
            self.httpd=httpd
     
        def run(self):
            """Code à exécuter pendant l'exécution du thread."""
            print("ok")
            #self.queue_serveur.put("data reçu du serveur")
            try:
                self.httpd.serve_forever()
            except (KeyboardInterrupt):
                print("fermeture du serveur")
            httpd.server_close()
    jusqu'ici tout va bien ! la boucle sur mon main continue à tourner, et le serveur est bien lancé dans mon thread "t_serveur"

    c'est ici que les choses se corsent...

    pour tester, je ping donc ma Raspberry depuis un navigateur ("mon adresse ip:8080") et ça fonctionne : je peux acceder à cette adresse, et sur la console de ma rapsberry, on m'affiche qu'une requête get a été envoyé au serveur de la Rpi=> nickel

    j'aimerais à présent (dans un premier temps) instancier une variable dés qu'une requête GET (ou POST) est effectué, et pouvoir utiliser cette variable dans mon main, et c'est là que je bloque...

    D'après ce que j'ai compris, pour pouvoir gérer cet événement, il faut que j'override la méthode DO_GET de ma classe "MyHandler" (quelque chose du style : )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
        def do_GET(s):
            self.flag_GET=True
    mais je n'ai aucune idée comment récuper ma variable "flag_GET" ailleurs dans mon script (et particulièrement comment la récuperer dans mon main où je vais devoir l'utiliser.

    La première étape selon moi et de réussir à la récupérer ailleurs dans mon thread t_serveur : étant donné que je n'appelle jamais la méthode DO_GET mais que celle-ci s'appelle "automatiquement" via "serve_forever" je n'ai aucune idée de comment la récuperer ailleurs

    Puis je devrais la récuperer depuis mon t_serveur jusqu'à mon main pour cela, j'ai cru comprendre que je devrais utiliser une Queue, c'est encore très abstrait pour moi, mais pour cette étape ça devrait aller...

    Merci d'avance pour 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,

    Citation Envoyé par StanSmooth Voir le message
    La première étape selon moi et de réussir à la récupérer ailleurs dans mon thread t_serveur : étant donné que je n'appelle jamais la méthode DO_GET mais que celle-ci s'appelle "automatiquement" via "serve_forever" je n'ai aucune idée de comment la récuperer ailleurs

    Puis je devrais la récuperer depuis mon t_serveur jusqu'à mon main pour cela, j'ai cru comprendre que je devrais utiliser une Queue, c'est encore très abstrait pour moi, mais pour cette étape ça devrait aller...
    Le serveur HTTP reçoit une requête GET et expédie dans la Queue un message du genre "j"ai reçu çà". De l'autre côté de la Queue, le consommateur lit le message et pour dans une (autre) Queue "répond lui çà". Ceci dit, je ne sais pas ce que doit faire le serveur pour construire sa réponse mais çà a intérêt à être compliqué pour que le serveur HTTP ne puisse répondre directement.

    note: essayez d'utiliser un serveur Web genre flask. Ca devrait vous simplifier la vie.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Salut,

    Tout d'abord merci pour ta réponse. Je ne suis pas sur d'avoir parfaitement saisi ta réponse. Peut-être aussi que je me suis mal exprimé sur le résultat que j'attends.

    en gros je souhaite pinger le serveur sur ma pi (depuis un navigateur par exemple). Lorsque la pi reçoit cette requête get, je souhaite qu'elle envoie un ordre à l'arduino (du genre "allume une led" pour faire simple).

    La boucle de communication entre l'arduino et la pi se fait sur le thread principal (=mon main)
    La fonction "serve_forever" (et donc le DO_GET aussi) se fait sur un thread appelé t_serveur.

    Voila voila pour les précisions

  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
    Citation Envoyé par StanSmooth Voir le message
    en gros je souhaite pinger le serveur sur ma pi (depuis un navigateur par exemple). Lorsque la pi reçoit cette requête get, je souhaite qu'elle envoie un ordre à l'arduino (du genre "allume une led" pour faire simple).
    "ping" et une requête HTTP sont des protocoles différents.
    Ceci dit, si vous avez une fonction allumer_led() je ne vois pas pourquoi elle ne pourrait pas être appelée à la réception d'un GET.

    Citation Envoyé par StanSmooth Voir le message
    La boucle de communication entre l'arduino et la pi se fait sur le thread principal (=mon main)
    La fonction "serve_forever" (et donc le DO_GET aussi) se fait sur un thread appelé t_serveur.
    Si vous construisez l'architecture de votre application de cette façon (plutôt que plus simple), c'est que vous avez quelques idées sur les messages qui seront échangés par vos threads et via quel mécanisme (des Queue par exemple).
    Après si vous vous contentez de dire "je veux" des threads, des Queue et de la POO et que vous vous rendez compte qu'il n'est pas si facile de penser à comment construire son application en faisant cohabiter tous ces machins, vous avez deux solutions: faire plus simple (i.e. sans tout çà et c'est possible), ou prendre le temps d'apprendre.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/11/2018, 16h54
  2. Multi Threads en Python
    Par PyNub dans le forum Général Python
    Réponses: 7
    Dernier message: 31/01/2014, 11h00
  3. Python et le multi threading?
    Par Linux44 dans le forum Général Python
    Réponses: 5
    Dernier message: 17/05/2012, 16h53
  4. Problème Multi thread Python 3.2
    Par SmithC dans le forum Général Python
    Réponses: 5
    Dernier message: 03/05/2011, 10h48
  5. Effectuer du multi THREAD en python
    Par parp1 dans le forum Général Python
    Réponses: 3
    Dernier message: 10/05/2006, 12h56

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