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 :

Réveiller un thread python par une ligne de commande linux


Sujet :

Python

  1. #1
    Membre du Club Avatar de snyfir
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 246
    Points : 56
    Points
    56
    Par défaut Réveiller un thread python par une ligne de commande linux
    Bonjour,

    j'ai un script python qui contient un thread avec une condition wait infini.
    Je souhaiterais par une ligne de commande linux réveiller ce thread.

    Par exemple:

    Lance pour la première fois l’application
    Envoi l'information au programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./unAutreProgrammePython --WakeMe
    Merci pour vos réponses.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    La méthode de communication inter-processus (IPC) la plus simple est sans doute via socket, en local.

    Le programme principal attend sur une attente d'un message (sans timeout ou non bloquant qu'on scrute en permanence), serveur socket.

    Et le second programme envoie un Go au principal en se connectant en tant que client au socket du programme principal.

    server_socket_test.py
    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
    # Echo server program
    import socket
     
    HOST = "127.0.0.1"
    PORT = 50007              # Arbitrary non-privileged port
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.sendall(data)
    conn.close()
    client_socket_test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Echo client program
    import socket
     
    HOST = "127.0.0.1"
    PORT = 50007              # The same port as used by the server
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
    s.close()
    print('Received', repr(data))
    Source: https://docs.python.org/3.4/library/socket.html

    Il suffit de lancer server_socket_test.py avant client_socket_test.py

  3. #3
    Membre du Club Avatar de snyfir
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 246
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par YCL-1 Voir le message
    Bonjour,

    La méthode de communication inter-processus (IPC) la plus simple est sans doute via socket, en local.

    Le programme principal attend sur une attente d'un message (sans timeout ou non bloquant qu'on scrute en permanence), serveur socket.

    Et le second programme envoie un Go au principal en se connectant en tant que client au socket du programme principal.

    server_socket_test.py
    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
    # Echo server program
    import socket
     
    HOST = "127.0.0.1"
    PORT = 50007              # Arbitrary non-privileged port
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.sendall(data)
    conn.close()
    client_socket_test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Echo client program
    import socket
     
    HOST = "127.0.0.1"
    PORT = 50007              # The same port as used by the server
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
    s.close()
    print('Received', repr(data))
    Source: https://docs.python.org/3.4/library/socket.html

    Il suffit de lancer server_socket_test.py avant client_socket_test.py
    Le problème de cette méthode est que mon serveur va utiliser du cpu à scruter en permanence si une donnée a été envoyé. Peut on le faire en gardant le serveur en sommeil?

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par snyfir Voir le message
    Le problème de cette méthode est que mon serveur va utiliser du cpu à scruter en permanence si une donnée a été envoyé. Peut on le faire en gardant le serveur en sommeil?
    ça dépend complètement de ta définition de "condition wait infinie", on peut essayer de deviner par élimination mais ça ira probablement plus vite si tu mets un bout de code explicite à disposition de ceux qui vont tenter de t'aider

  5. #5
    Membre du Club Avatar de snyfir
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 246
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    ça dépend complètement de ta définition de "condition wait infinie", on peut essayer de deviner par élimination mais ça ira probablement plus vite si tu mets un bout de code explicite à disposition de ceux qui vont tenter de t'aider
    Ce que je veux dire par wait infinie est que le thread ce bloque et ne se réveille uniquement que si on le lui demande.
    Exemple avec un sémaphore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    semaphore = threading.BoundedSemaphore()
    semaphore.acquire() # block the thread until is delockink
    ... do the job
    semaphore.release()

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par snyfir Voir le message
    Ce que je veux dire par wait infinie est que le thread ce bloque et ne se réveille uniquement que si on le lui demande.
    ah ok, avec un while 1: sleep(50000) alors, ou via un signal SIGSTOP c'est ça ? ou un subprocess.Popen.wait() qui tourne dans le vide peut-être ?

    Exemple avec un sémaphore
    ahhh ok, au temps pour moi donc ta question finalement, c'est de savoir comment on réveille un sémaphore ?

    par contre et pour la petite info, un thread est un processus mais un processus n'est pas un thread, si tu lances 2 programmes distincts comme dans ton premier message avec ./UnProgrammePython, ./UnAutreProgrammePython --WakeMe t'es plus dans le contexte d'utilisation des threads, c'est 2 processus distincts et les sémaphores non plus ne fonctionnent pas

    c'est juste un malentendu avec ton premier post ou y'a bien une confusion au niveau des techno à utiliser de ton coté ?

  7. #7
    Membre du Club Avatar de snyfir
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 246
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    ah ok, avec un while 1: sleep(50000) alors, ou via un signal SIGSTOP c'est ça ? ou un subprocess.Popen.wait() qui tourne dans le vide peut-être ?


    ahhh ok, au temps pour moi donc ta question finalement, c'est de savoir comment on réveille un sémaphore ?

    par contre et pour la petite info, un thread est un processus mais un processus n'est pas un thread, si tu lances 2 programmes distincts comme dans ton premier message avec ./UnProgrammePython, ./UnAutreProgrammePython --WakeMe t'es plus dans le contexte d'utilisation des threads, c'est 2 processus distincts et les sémaphores non plus ne fonctionnent pas

    c'est juste un malentendu avec ton premier post ou y'a bien une confusion au niveau des techno à utiliser de ton coté ?
    Enfaite je sais utiliser les sémaphores dans un même processus.
    Ma question est plus comment faire pour réveiller un thread d'un processus à partir d'un autre processus. En sachant que je veux garder le premier processus au repos le plus possible (c'est à dire ne pas devoir le réveiller en permanence pour surveiller si un autre processus veux lui envoyer une commande).
    En espérant être plus claire.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par snyfir Voir le message
    Enfaite je sais utiliser les sémaphores dans un même processus.
    Ma question est plus comment faire pour réveiller un thread d'un processus à partir d'un autre processus. En sachant que je veux garder le premier processus au repos le plus possible (c'est à dire ne pas devoir le réveiller en permanence pour surveiller si un autre processus veux lui envoyer une commande).
    En espérant être plus claire.
    donc si je comprends bien il y a au moins 3 processus en jeu, UnProgrammePython, qui va lancer au moins 1 thread en l'air tandis que le thread principal va servir de scheduler et notifiera son thread fils pour lui dire de relacher le sémaphore, et UnAutreProgrammePython qui lui donne l'ordre au scheduler de UnProgrammePython de réveiller son fiston, ce qui finalement revient à avoir un thread fils endormi, tandis que le thread principal/père/sched. reste à l'écoute d'une donnée arrivant d'un autre programme

    je ne t'apprends donc rien, les sémaphores servent à acquérir ou relâcher des ressources, pas à attendre ou à endormir un processus, si tu veux vraiment endormir ton processus le meilleur moyen est de le stoper via un signal SIGSTP et à ce moment là tu peux envisager de le réveiller en lui envoyant un signal SIGCONT (en admettant que tu aies sont pid )

    c'est pas magique, un sémaphore est une structure stockée en mémoire, entre plusieurs threads (processus légers, qui partagent le même espace d'adressage) le sémaphore est disponible, mais entre deux processus standards qui ne partagent pas le même espace d'adressage il n'y a aucun moyen pour le 1er processus de relâcher un sémaphore dans le 2nd processus

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/01/2013, 14h01
  2. Liste de logiciel de sauvegarde et de restauration de partition lançable par une ligne de commande
    Par zakuli dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 20/08/2010, 10h58
  3. [XL-2003] Problème sur une sélection puis séparation par une ligne blanche
    Par korni184 dans le forum Excel
    Réponses: 12
    Dernier message: 08/04/2010, 11h45
  4. rejoint 2 points par une ligne
    Par Frolic dans le forum Tkinter
    Réponses: 1
    Dernier message: 26/05/2007, 23h23
  5. relier deux reseaux par une ligne telephonique?
    Par maamar1979 dans le forum Hardware
    Réponses: 2
    Dernier message: 13/09/2006, 13h41

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