python saída de um bloqueio de rosca?
-
23-08-2019 - |
Pergunta
No meu código eu ciclo embora raw_input()
para ver se o usuário tiver solicitado a parar. Meu aplicativo pode sair antes os quites usuário, mas o meu problema é o aplicativo ainda está vivo até que eu inserir uma chave para retornar do raw_input()
função de bloqueio. Que posso fazer para forçar raw_input()
para retornar por talvez enviá-lo uma entrada falsa? Eu poderia terminar a thread que é em? (Os únicos dados que tem é uma única variável chamada wantQuit
).
Solução
Você pode usar este tempo fora função que envolve a função. Aqui está a receita 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
Outras dicas
Por que você não apenas marcar o tópico como demoníaca?
A partir da docs :
A linha pode ser sinalizado como um “thread daemon”. O significado desta bandeira é que todo o programa sai do Python quando apenas threads daemon estão à esquerda. O valor inicial é herdada do segmento de criação. A bandeira pode ser configurado através do atributo daemon.
Você pode usar uma função non-blocking para ler a entrada do usuário.
Esta solução é específico para 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)
Para fazer algo semelhante em Unix, que lê uma linha de cada vez, ao contrário da versão janelas lendo caractere por caractere (graças a Aaron Digulla para fornecer o link para o fórum de usuários 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()
Veja também: http://code.activestate.com/recipes/134892/
Há um post sobre a lista de discussão Python que explica como fazer isso para 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