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 :

Threading vs input() : le retour [Python 3.X]


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Février 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Février 2020
    Messages : 9
    Par défaut Threading vs input() : le retour
    Bonjour,
    étant confronté au problème décrit dans ce sujet, fermé d'où le pourquoi j'ouvre le mien:
    https://www.developpez.net/forums/d1...ding-vs-input/
    à savoir le bloquage par input() des threads lancés en parallèle, j'ai testé le programme proposé pour prouver que input() ne bloque pas:
    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
    from threading import Thread, Event
    from time import sleep
     
    done = Event()
     
    def do_something():
        count = 0
        while not done.is_set():
            print ('waiting', count)
            count += 1
            sleep(0.1)
     
    p = Thread(target=do_something)
    p.start()
    while True:
        try:
            s = input('$$$ ')
        except KeyboardInterrupt:
            done.set()
            break
        print ('********', s)
    p.join()
    print ('Bye')
    et là... ça me prouve qu'il bloque.

    Voici ce que j'obtiens:
    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
    $$$ waitinga
     ********0 
    a
    $$$ z
    waiting********  1z
     
    $$$ e
    waiting********  2e
     
    $$$ r
    waiting********  3r
     
    $$$ t
    waiting********  4t
     
    $$$ y
    waiting********  5y
     
    $$$ 
    waiting 6
    Bye
    >>>
    Donc input() bloque bel et bien le threading avec Python 3.7.0 sous Windows 10.
    la preuve avec le code modifié en ajoutant "sleep(1)" juste après "print ('********', s)":
    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
    waiting$$$  a
    0********
     a
    waiting 1
    waiting 2
    waiting 3
    waiting 4
    waiting 5
    waiting 6
    waiting 7
    waiting$$$  z
    8********
     z
    waiting 9
    waiting 10
    waiting 11
    waiting 12
    waiting 13
    waiting 14
    waiting 15
    $$$ e
    waiting********  16e
     
    waiting 17
    waiting 18
    waiting 19
    waiting 20
    waiting 21
    waiting 22
    waiting 23
    waiting 24
    $$$ 
    waiting 25
    Bye
    >>>
    Quelqu'un a-t'il une autre solution à me proposer?

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut


    Ce code fonctionne bien :

    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
    #! python3
    # coding: utf-8
     
    from threading import Thread, Event
    from time import sleep
     
    done = Event()
     
     
    def do_something():
        count = 0
        while not done.is_set():
            print('waiting', count)
            count += 1
            sleep(3)
     
     
    p = Thread(target=do_something)
    p.daemon = True
    p.start()
     
    while True:
        if input() == "stop":
            done.set()
            break
     
    p.join()
    print('Bye')

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Février 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Février 2020
    Messages : 9
    Par défaut
    Merci de cette réponse rapide!
    Cependant, non, cela ne marche pas "chez moi" (j'ai remis le sleep à 0.1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    waitinga
     z
    0e
     
    r
    waitingt
     y
    1stop
     
    Bye
    si je CTRL+C au lieu de taper "stop " je vois bien le thread qui continue:
    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
    waiting
     Traceback (most recent call last):0
     
      File "**************\essai.py", line 24, in <module>
        if input() == "stop":
    KeyboardInterrupt
    >>> waiting 1
    waiting 2
    waiting 3
    waiting 4
    waiting 5
    waiting 6
    waiting 7
    waiting 8
    waiting 9
    waiting 10
    waiting 11
    waiting 12
    waiting
    et là je suis obligé de fermer la fenêtre
    Est-ce une limitation due à Windows? Google ne m'apporte pas de réponse... et la communauté Developpez ?

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Février 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Février 2020
    Messages : 9
    Par défaut
    Vu chez stackoverflow: https://stackoverflow.com/questions/...ing-to-console
    Exactement le même problème: sous Windows ça ne passe pas, et la seule réponse c'est "Sous Ubuntu ça roule"...
    Une explication?

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Février 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Février 2020
    Messages : 9
    Par défaut Solved!!
    Je crois que j'ai la réponse, même si elle ne me fait pas plaisir:
    threading module is not actually apply parallel running of threads because of some mechanism called GIL
    (source:https://stackoverflow.com/questions/...06536#43306536)
    Donc ça ne "marche" pas parce que je fais "F5" sous Idle... Si je lance "python essai.py" tout roule!!
    Voila, moins bête ce soir, mais il reste du boulot...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 718
    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 718
    Par défaut
    Citation Envoyé par Cafebar Jadi Voir le message
    Donc ça ne "marche" pas parce que je fais "F5" sous Idle... Si je lance "python essai.py" tout roule!!
    Un problème constaté en exécutant du code avec un IDE doit être confirmé en exécutant le code sans l'IDE. Que ce soit IDLE ou autre, l'exécution de votre programme sera (plus ou moins) instrumentée par l'IDE, ce qui ne sera pas sans effets de bords sur les entrées/sorties, les délais,...

    Et ce n'a rien avoir avec le GIL: il est aussi là lorsqu'on exécute normalement le programme.

    Par contre, lancer le programme sur un "terminal" ou le lancer en remplaçant les entrées sorties par des pipes change son comportement selon comment on gère la simultanéité de la lecture et de l'écriture sur stdin, stdout, stderr,...

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

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

Discussions similaires

  1. [Python 3.X] Threading vs input()
    Par blablablax dans le forum Général Python
    Réponses: 1
    Dernier message: 09/09/2018, 20h37
  2. Réponses: 3
    Dernier message: 10/05/2010, 20h19
  3. Retour de threads
    Par ploxien dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 06/08/2007, 13h17
  4. code retour d'un thread
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 25/07/2007, 08h17
  5. Ne pas avoir de retour a la ligne en ajoutant un input
    Par maxos75 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 06/01/2006, 14h31

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