pitone uscita un filo di blocco?
-
23-08-2019 - |
Domanda
Nel mio codice ciclo ho pensato raw_input()
per vedere se l'utente ha richiesto di smettere. La mia applicazione può uscire prima che l'utente si chiude, ma il mio problema è l'applicazione è ancora in vita fino a quando entro in un tasto per tornare dalla funzione di blocco raw_input()
. Posso fare per forza raw_input()
per tornare da forse l'invio di un ingresso falso? Potrei terminare il filo che è su? (Gli unici dati che ha è una singola variabile denominata wantQuit
).
Soluzione
È possibile utilizzare questo tempo fuori funzione che avvolge la vostra funzione. Ecco la ricetta da: 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
Altri suggerimenti
Perché non basta marcare il filo come demoniaca?
docs :
Un filo può essere contrassegnato come un “filo daemon”. Il significato di questo flag è che l'intero programma Python esce quando solo thread demoni sono lasciati. Il valore iniziale è ereditato dalla filettatura creando. Il flag può essere impostato tramite l'attributo daemon.
Si potrebbe utilizzare un non-blocking funzione per leggere l'input dell'utente.
Questa soluzione è specifico per 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)
Per fare qualcosa di simile a Unix, che legge una riga alla volta, a differenza della versione di Windows leggere char da char (grazie a Aaron Digulla per fornire il link al forum degli utenti Python):
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()
Si veda anche: http://code.activestate.com/recipes/134892/
C'è un postare su Python mailing list che spiega come fare questo per 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