포스트

[Python] sleep(0.5) 한 줄로 잡은 실무 버그 2가지 – 파일 손상과 동시성 문제 해결기

개발을 하다 보면,

sleep()이라는 함수는 대부분 “성능을 떨어뜨리는 느린 코드”라고 생각하기 쉽습니다.

하지만 제가 실무에서 겪은 두 가지 문제는 딱 이 sleep() 하나로 깔끔하게 해결됐습니다.

이번 글에서는 다운로드와 큐 처리에서 발생한 문제를 어떻게 단순한 딜레이 하나로 잡았는지 정리해보려고 합니다.

먼저 요약입니다.

1
2
1. 다운로드 문제 해결 - 수신, 저장 후 각각 딜레이 추가
2. 큐 우선순위 (동시성 경쟁) 문제 해결 - 상태 업데이트와 태스크 점유 상태 확인 사이에 딜레이 추가

1. 이미지가 다운로드는 됐는데 나중에 깨지는 문제 ** 이미지 다운로드 기능을 만들고 있었는데, 어느 날 이런 오류가 발생했습니다.

1
2
image file is truncated (12 bytes not processed)

  • 서버로부터 응답은 왔지만, 데이터가 다 도착하기 전에 저장을 시작했을 수 있음
  • 저장 직후 파일이 아직 안정되지 않은 상태에서 다른 로직이 접근했을 수도 있음
  • 요약하자면, 타이밍 문제
  • requests.get()로 응답을 받은 직후 약간의 딜레이 (sleep(0.3))
  • 저장이 끝난 직후에도 짧은 딜레이 (sleep(0.1))
  • 그리고 PIL로 이미지를 검증 (Image.open(…).verify())

2. 큐 처리 시스템에서 두 프로세스가 같은 책을 동시에 처리한 문제 **

  • READY 상태의 책을 하나의 프로세서가 PROCESSING으로 바꾸는 순간
  • 거의 동시에 다른 프로세서도 같은 책을 PROCESSING으로 바꿔버림
  • 결국 두 개의 프로세스가 같은 작업을 하게 되는 경쟁 상태(race condition) 발생
  • update_status()로 상태를 변경한 후
  • 바로 다음 단계로 가지 않고 sleep(5)로 상태 반영이 확실해질 때까지 기다림
  • 이후 get_status()로 상태를 다시 확인하고, 자기 자신이 처리 중인지 확인

  • 파일을 저장할 때는 디스크가 안정될 때까지
  • API 호출 후에는 DB 반영이 확실해질 때까지
  • 멀티프로세스 환경에서는 서로 엉키지 않도록 타이밍을 조절해야 합니다

  • 동시성(concurrency)
  • 경쟁 상태(race condition)
  • 파일 I/O 안정화
  • 네트워크 수신 타이밍
  • 큐 처리 시스템
  • 멀티프로세싱 안전성

여담:

예전에 제가 한창 게임 서버 개발에 관심을 가졌을 때 C# 서버 제작 명강의를 찾아 들었던 적이 있습니다. 그때 lock을 하고 딜레이를 주고 이런 작업들을 봤었는데, 제가 보기엔 그렇게 딜레이를 주는 것이 과연 좋은 해결방법일까? 라는 의문을 가졌던 것 같습니다. 왜냐하면 몇 초간 딜레이를 줄 건지가 너무 감에 의존하는 것 같은 인상을 받았거든요. 그런데 이번에 제가 직접 오류를 겪어보니 가장 간단하고 효과적인 해결방법이 바로 딜레이라는 것을 알게되었습니다. ㅎㅎ

제가 “동시성 경쟁”문제를 해결하려 보니 처음에는 몇 번 랜덤 딜레이 간격으로 상태를 받아와서 진짜 누가 점유했는지를 확실히 알아낸 다음 진행하자! 라고 방안을 냈다가, 좀더 논의하다 보니, 애초에 그냥 한 번만 딜레이를 주고 한 번만 받아오면 되겠더라구요. 애초에 동시에 두 프로세서가 자기의 일인 것으로 착각을 할 수가 없어야하는데, 통신이나 처리 속도의 한계로 인해 겹치게 되는거거든요. 애초에 그런 겹친 태스크 점유가 조금의 시간차 때문에 벌어진 일이니, 문제가 발생한 원인을 역으로 해결책으로 쓰는 셈입니다.

문제가 “타이밍의 빠른 겹침”으로 인해 발생했으므로, 해결책은 “타이밍을 늘어뜨리기” 인거죠 ~

이 딜레이가 아예 없고 있고가 큰 차이인 것을 이제 알았습니다.

딜레이 굳

sticker

+추가) https://blog.naver.com/devramyun/223811470692

[1부] 스토리북 자동화 처리 시스템 구축기: 파이프라인 설계와 안정성 확보 들어가며… AI와 자동화 기술이 콘텐츠 생산 방식을 혁신하고 있는 시대입니다. 저는 수천 개의 스토리… 들어가며… AI와 자동화 기술이 콘텐츠 생산 방식을 혁신하고 있는 시대입니다. 저는 수천 개의 스토리…

https://blog.naver.com/devramyun/223811494542

[2부] 스토리북 자동화 처리 시스템 구축기: 동영상 생성 엔진과 엔드투엔드 통합 들어가며 [1부]에서는 스토리북 자동화 시스템의 전체 구조와 안정성 확보 방법에 대해 알아보았습니다. ht… 들어가며 [1부]에서는 스토리북 자동화 시스템의 전체 구조와 안정성 확보 방법에 대해 알아보았습니다. ht…

https://blog.naver.com/devramyun/223819653871

[20250402] 프로그램 개발 회고(2019.07~2025.04) 1. (Python) 이미지 수치 측정 및 라벨링 프로그램(2019.01~2019.07) 연구실에서 시간이 남아서 만들게 된…

  1. (Python) 이미지 수치 측정 및 라벨링 프로그램(2019.01~2019.07) 연구실에서 시간이 남아서 만들게 된…

#파이썬 #딜레이 #sleep #동시성 #경쟁상태 #파일다운로드 #멀티프로세싱 #실무노하우 #큐처리 #I/O에러 #image-file-is-truncated #상태관리

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.