我有timeout
上下文管理器,它與信號完美配合,但會在多線程模式下引發錯誤,因爲信號只能在主線程中工作。具有線程的Python超時上下文管理器
def timeout_handler(signum, frame):
raise TimeoutException()
@contextmanager
def timeout(seconds):
old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(seconds)
try:
yield
finally:
signal.alarm(0)
signal.signal(signal.SIGALRM, old_handler)
我見過的timeout
裝飾實現,但我不知道怎麼打發yield
內從threading.Thread
派生類。我的變體不起作用。
@contextmanager
def timelimit(seconds):
class FuncThread(threading.Thread):
def run(self):
yield
it = FuncThread()
it.start()
it.join(seconds)
if it.isAlive():
raise TimeoutException()
正如我在第一個變種我得到'ValueError異常:信號只能在主thread'在line'original_handler = signal.signal(signal.SIGALRM,timeout_handler)' – San4ez 2013-02-22 07:03:21
正如OP所述,*信號只能在主線程*中工作。 OP需要一個不同的解決方案。 – 2013-02-25 12:59:28