dans mon code je boucle bien raw_input() pour voir si l'utilisateur a demandé de quitter. Mon application peut quitter avant que l'utilisateur ne quitte, mais mon problème est que l'application est encore en vie jusqu'à ce que j'entre une clé pour retourner à partir de la fonction de blocage raw_input(). Puis-je faire pour forcer raw_input() à revenir? en envoyant peut-être une fausse entrée? pourrais-je terminer le fil sur son? (les seules données qu'il a est un seul appel var wantQuit).python quitte un thread de blocage?
Répondre
Vous pouvez utiliser cette fonction de temporisation qui enveloppe votre fonction. Voici la recette de: http://code.activestate.com/recipes/473878/
def timeout(func, args=(), kwargs={}, timeout_duration=1, default=None):
'''This function will spwan a thread and run the given function using the args, kwargs and
return the given default value if the timeout_duration is exceeded
'''
import threading
class InterruptableThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.result = default
def run(self):
try:
self.result = func(*args, **kwargs)
except:
self.result = default
it = InterruptableThread()
it.start()
it.join(timeout_duration)
if it.isAlive():
return it.result
else:
return it.result
Nice. Confirmé pour travailler dans WinXP et Linux. – Deestan
Ce code est un mensonge: le InterruptableThread n'est en effet pas interrompu. Il va bloquer l'un ou l'autre chemin et rester pour toujours. Il devrait au moins être marqué comme thread de démon afin qu'il n'arrête pas l'interpréteur de quitter. Quelqu'un a déjà remarqué le problème: http://code.activestate.com/recipes/473878/#c3 – Bluehorn
Vous pouvez utiliser une fonction non bloquante pour lire les entrées utilisateur.
Cette solution est spécifique à Windows:
import msvcrt
import time
while True:
# test if there are keypresses in the input buffer
while msvcrt.kbhit():
# read a character
print msvcrt.getch()
# no keypresses, sleep for a while...
time.sleep(1)
Pour faire quelque chose de similaire dans Unix, qui lit une ligne à la fois, contrairement à la version Windows lecture omble chevalier par char (grâce à Aaron Digulla pour fournir le lien vers la python forum utilisateur):
import sys
import select
i = 0
while i < 10:
i = i + 1
r,w,x = select.select([sys.stdin.fileno()],[],[],2)
if len(r) != 0:
print sys.stdin.readline()
Voir aussi: http://code.activestate.com/recipes/134892/
+1 pour prendre le temps d'écrire un exemple :) –
Il y a un post on the Python mailing list qui explique comment faire pour Unix:
# this works on some platforms:
import signal, sys
def alarm_handler(*args):
raise Exception("timeout")
def function_xyz(prompt, timeout):
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(timeout)
sys.stdout.write(prompt)
sys.stdout.flush()
try:
text = sys.stdin.readline()
except:
text = ""
signal.alarm(0)
return text
Merci, j'ai ajouté un petit exemple dans ma réponse basée sur ce post (+1) –
404 sur le lien – jonasl
Merci . Correction du lien et copie de la source ici. –
Pourquoi ne pas simplement marquer le fil comme daemonic?
De l'docs:
Un fil peut être marqué comme un « thread démon ». La signification de ce drapeau est que tout le programme Python se ferme lorsque seuls les threads démons sont laissés. La valeur initiale est héritée du thread de création. Le drapeau peut être défini via l'attribut daemon.
- 1. Quitter un blocage de thread sur TCP read in C#
- 2. Python thread dump
- 3. Non-blocage Socket Polling vs Blocage socket
- 4. Jointure de thread interruptible en Python
- 5. Problème de blocage Read()
- 6. wxGLCanvas quitte le processus
- 7. Blocage de thread lors de l'utilisation de ReadDirectoryChangesW de manière asynchrone
- 8. Python Subprocess.Popen à partir d'un thread
- 9. Thread simple en Python 2.6 utilisant thread.start_new_thread()
- 10. Blocage de Graphics.drawImage
- 11. Test d'un blocage avec nUnit
- 12. Comment obtenir l'état actuel d'un thread (blocage, suspension, exécution, etc.) dans win32?
- 13. PLINQ problème/techniques pour impliment multi-thread, listes sans blocage (en C#)
- 14. Comment déclencher une action lorsque l'utilisateur quitte un JTextBox?
- 15. Internet Explorer découvre quand un utilisateur quitte la page
- 16. WScript.Shell et l'exécution de blocage?
- 17. Blocage de la lecture FIFO via l'objet ifstream
- 18. Comment détecter un blocage avec la bibliothèque Asio?
- 19. 1x1 Iframes blocage
- 20. sans blocage() avec Winsocks
- 21. blocage d'adresse IP
- 22. SQLGetDiagRec provoque un blocage dans la version de publication Unicode
- 23. java comment faire un thread d'expéditeur
- 24. Python pour S60: Ecoute d'une socket en thread sparate
- 25. BackgroundWorker OnWorkCompleted lève l'exception de thread-thread
- 26. Comment puis-je exécuter certaines commandes sur un thread séparé?
- 27. Comment puis-je provoquer un blocage dans MySQL à des fins de test
- 28. en utilisant pyunit sur un thread réseau
- 29. invocation acteur multiple de blocage des appels
- 30. Quelle est la différence entre un thread de travail et un thread d'E/S?
Exemple de code serait bien. – codeape