개요
이 글은 운영 중 접한 ""오류를 어떻게 해결했는지 설명합니다. 영상은 아래 유투브에서 만나볼 수 있습니다.
오류 발견
FastAPI로 만든 서비스에서 "signal only works in main thread" 오류가 발생했습니다. 처음 보는 오류여서 열심히 검색을 했습니다. 검색을 종합해보니 직접 예제를 만들어서 정확한 원인을 분석하는게 좋을 것 같았습니다
ChatGPT를 이용하여 예제 생성
어떻게 예제를 만들어볼까 고민하다가 chatgpt이 문득 떠올랐습니다. 긴가민가하는 마음으로 chatgpt에게 도움을 요청하니, 놀랍게도 예제코드를 만들어줬습니다.
예제 코드는 아래와 같습니다.
import threading
import signal
import time
def signal_handler(signum, frame):
print("Signal received.")
def child_thread():
print("Child thread started")
while True:
time.sleep(1)
print("Child thread is running.")
# register the signal handler
signal.signal(signal.SIGINT, signal_handler)
# start the child thread
child_thread = threading.Thread(target=child_thread)
child_thread.start()
# wait for the child thread to finish
child_thread.join()
signal 오류 분석
"signal only works in main thread"오류는 말 그대로 메인 쓰레드만 signal을 처리할 수 있다는 의미입니다. 다르게 말하면 자식 쓰레드에서 signal을 받아서 오류가 발생한 상황입니다.
오류가 발생한 FastAPI코드를 살펴보니 background_task로 자식 쓰레드를 실행하고, 자식 쓰레드로 파이썬 패키지를 실행하고 있었습니다.
추측으로는 background_task가 실행한 파이썬 패키지가 signal을 전달한 상황이었고, background_task는 자식 쓰레드로 실행되므로 signal을 처리하지 못해 오류가 발생한 것 같습니다.
오류 해결
background_task가 signal을 처리하지 않도록 코드를 수정했습니다. 가장 간단한 방법은 자식 프로세스를 실행하여 패키지를 실행하는 방법이라고 생각합니다.
아마도 시간이 난다면 event기반으로 리팩토링 할 것 같습니다.
'회고모음' 카테고리의 다른 글
코드 줄 끝의 tab이 있어 장애발생 (0) | 2023.01.19 |
---|---|
iframe을 사용하는 서비스에 만난 x-frame-options deny오류 (0) | 2023.01.17 |
uuid를 잘못 설정하여 오류를 만나다. (0) | 2023.01.09 |
올바르지 않은 비동기로직으로 쿠버네티스 probe실패 (0) | 2023.01.09 |
Elasticsearch 지연 현상 (3) | 2023.01.05 |