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.
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? –
prima leggi la frase analizzando la classica punteggiatura. Vorrei che ci fosse un modo per fermare il tempo dormendo da qualche parte. – Simon
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