私は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
のデコレータの実装を見てきましたが、私はthreading.Thread
から派生クラス内yield
を渡す方法がわかりません。私の変種は動作しません。
@contextmanager
def timelimit(seconds):
class FuncThread(threading.Thread):
def run(self):
yield
it = FuncThread()
it.start()
it.join(seconds)
if it.isAlive():
raise TimeoutException()
:信号が唯一のメインthread'で動作しますline 'original_handler = signal.signal(signal.SIGALRM、timeout_handler)' – San4ez
OPが述べたように、*シグナルはメインスレッド*でしか動かない。 OPには、代わりに別の解決策が必要です。 –