Tôi có timeout
trình quản lý ngữ cảnh hoạt động hoàn hảo với tín hiệu nhưng nó làm tăng lỗi ở chế độ đa luồng vì tín hiệu chỉ hoạt động trong chuỗi chính.Trình quản lý ngữ cảnh thời gian Python với chủ đề
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)
Tôi đã nhìn thấy thi trang trí của timeout
nhưng tôi không biết làm thế nào để vượt qua yield
bên trong lớp có nguồn gốc từ threading.Thread
. Biến thể của tôi sẽ không hoạt động.
@contextmanager
def timelimit(seconds):
class FuncThread(threading.Thread):
def run(self):
yield
it = FuncThread()
it.start()
it.join(seconds)
if it.isAlive():
raise TimeoutException()
Như trong phiên bản 1 của tôi, tôi đã 'ValueError: tín hiệu chỉ hoạt động trong thread' chính trong dòng 'original_handler = signal.signal (signal.SIGALRM, timeout_handler)' – San4ez
Như OP đã nêu, tín hiệu * chỉ hoạt động trong chuỗi chính *. OP cần một giải pháp khác thay thế. –