함수가 실행되는데 너무 오래 걸릴 때, TimeOutError를 raise 하면서 일찍 종료시키는 방법에 관한 내용이다. 주로 multiprocessing을 사용할 때 유용하다.
기대 효과
•
문제가 있는 process 때문에 전체 process가 종료되지 않는 문제를 방지할 수 있다.
•
문제가 있는 process가 실행되면서 너무 많은 memory를 차지하여 다른 정상적인 process에 영향을 준다면, 이를 방지할 수 있다.
Timeout decorator 활용하기
함수를 정의할 때 decorator @ 를 활용하여 몇 초 안에 이 함수의 실행이 종료되지 않으면 TimeoutError를 raise 하도록 설정할 수 있다.
•
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
복사