2016-01-19 11 views
5

Lekko zmodyfikowałem przykład sygnału z official docs (dół strony).signal.alarm nie wyzwala wyjątku na czas

Dzwonię pod numer sleep 10, ale chciałbym, aby alarm został podniesiony po 1 sekundzie. Po uruchomieniu poniższego fragmentu zajmuje to więcej niż 1 sekundę, aby wywołać wyjątek (myślę, że trwa to całe 10 sekund).

import signal, os 

def handler(signum, frame): 
    print 'Interrupted', signum 
    raise IOError("Should after 1 second") 

signal.signal(signal.SIGALRM, handler) 
signal.alarm(1) 

os.system('sleep 10') 

signal.alarm(0) 

Jak mogę zakończyć działanie funkcji po przekroczeniu limitu czasu w aplikacji jednowątkowej?

+0

Czy Twoje połączenie z systemem "uśpienia" nie zawiesza wszystkiego, łącznie z licznikiem sygnału? Alarm nie gaśnie, ponieważ również śpi. Prawdopodobnie musisz przekazać to wywołanie "uśpienia" do osobnego procesu z modułem ['subprocess'] (https://docs.python.org/3/library/subprocess.html). – JCVanHamme

Odpowiedz

4

Od the docs:

Pythona obsługi sygnału nie zostanie wykonana wewnątrz niskiego poziomu (C) obsługi sygnału. Zamiast tego, obsługa sygnału niskiego poziomu ustawia flagę , która mówi maszynie wirtualnej, aby wykonała odpowiednią obsługę sygnału Python w późniejszym punkcie (na przykład przy następnej instrukcji kodu bajtowego ).

Dlatego sygnał taki jak wygenerowany przez signal.alarm() nie może w niektórych przypadkach zakończyć funkcji po przekroczeniu limitu czasu. Albo the function should cooperate by allowing other Python code to run (e.g., by calling PyErr_CheckSignals() periodically in C code) lub powinieneś use a separate process, to terminate the function in time.

Twoja kaseta może zostać naprawiona, jeśli używasz subprocess.check_call('sleep 10'.split()) zamiast os.system('sleep 10').

Powiązane problemy