Search
⏱️

함수에 Timeout 설정하기 - Python

함수가 실행되는데 너무 오래 걸릴 때, TimeOutError를 raise 하면서 일찍 종료시키는 방법에 관한 내용이다. 주로 multiprocessing을 사용할 때 유용하다.
기대 효과
문제가 있는 process 때문에 전체 process가 종료되지 않는 문제를 방지할 수 있다.
문제가 있는 process가 실행되면서 너무 많은 memory를 차지하여 다른 정상적인 process에 영향을 준다면, 이를 방지할 수 있다.

Timeout decorator 활용하기

함수를 정의할 때 decorator @ 를 활용하여 몇 초 안에 이 함수의 실행이 종료되지 않으면 TimeoutError를 raise 하도록 설정할 수 있다.
timeout-decorator
pnpnpn
Package 설치
# conda activate {YOUR_CONDA_ENV_NAME} pip install timeout-decorator # installation
Bash
복사
활용
import time import timeout_decorator from timeout_decorator.timeout_decorator import TimeoutError from multiprocessing as mp from tqdm import tqdm @timeout_decorator.timeout(10) # 10 seconds def timeout_task(n): if n % 100 = 0: # will timeout time.sleep(600) elif n % 12 == 0: # will not time out time.sleep(5) else: # will not timeout pass return n def timeout_task_wrapper(n): try: return timeout_task(n) except TimeoutError as error: return f"Task timed out: {error} for {n}" def main(): n_proc = mp.cpu_count() ns = 600 with mp.Pool(n_proc) as pool: with tqdm(total=ns, desc="Processing", ncols=80) as pbar: for output in pool.imap_unordered(timeout_task_wrapper, range(ns)): print(output) pbar.update() if __name__ == '__main__': main()
Python
복사