2011-12-08 22 views
6

In * nix il segnale Python mi consente di interrompere il sonno prima che sia pronto. C'è qualche meccanismo simile disponibile in Windows - sembra che tutti i metodi finiscano per intercettare il codice solo dopo il sonno?C'è un modo per fermare time.sleep in windows?

Codice esempio:

from time import sleep 
.. do something that will intercept the sleep 
try: 
    sleep(60) 
finally: 
    print 'how to get here under 60 seconds in windows?' 

domanda simile che non ha una risposta per le finestre: break/interrupt a time.sleep() in python

documentazione
+5

Puoi scrivere il tuo codice in modo che sia in attesa di un 'threading.Event', con un timeout di 60 secondi, e colpisca quell'evento da un altro thread se vuoi annullare l'attesa? –

+1

prima leggi la frase analizzando la classica punteggiatura. Vorrei che ci fosse un modo per fermare il tempo dormendo da qualche parte. – Simon

+0

Non è il mio codice. È un codice client sconosciuto che sto tentando di interrompere dopo che si è verificato il timeout. Sembra che in cpython non esista un meccanismo veramente valido .. e sì, abbiamo anche provato i thread e il sottoprocesso è un no go. – mkorpela

risposta

4

Il Python per signal dice:

• Sebbene Python gestori di segnale sono chiamati in modo asincrono fino a l'utente Python è interessato, possono verificarsi solo tra e "atomico" istruzioni dell'interprete Python. Ciò significa che i segnali che arrivano durante lunghi calcoli implementati esclusivamente in C (ad esempio le corrispondenze di espressioni regolari su grossi corpi di testo) possono essere ritardati per una quantità di tempo arbitraria.

mentre time dice:

Il tempo di sospensione effettiva può essere inferiore a quello richiesto, perché ogni segnale catturato terminerà il sonno() dopo l'esecuzione di routine di cattura che di segnale.

In Windows, a quanto pare time.sleep() non è implementato in conformità con la documentazione, perché il gestore di un segnale ricevuto durante il sonno non sia accolta fino a quando l'intera durata del sonno è finito. Il seguente esempio:

import signal, time 

def handler(signum, frame): 
    print('Signal handler called with signal', signum) 

signal.signal(signal.SIGINT, handler) 

print("signal set, sleeping") 
time.sleep(10) 
print("sleep done") 

stampe:

signal set, sleeping 
Signal handler called with signal 2 
sleep done 

con la prima linea si verifica subito e le seconde due dopo 10 secondi, indipendentemente da quando si verifica l'interrupt.

Come suggerisce Thomas K, una strategia migliore sarebbe utilizzare thread e sincronizzazione.

1

io non sono sicuro se questo lo farà per voi, ma qui è un po 'soluzione alternativa si potrebbe fare:

for i in range(60): 
    if checkIfIShouldInterruptSleep(): 
     break 
    time.sleep(1) 
print "Finished Sleeping!" 

E' preciso solo al secondo, ma potrebbe servire il vostro scopo. Buona programmazione!

Problemi correlati