python - time.sleep(...) 호출 시 hang이 걸리는 듯한 문제
일례로 그냥 콘솔 유형으로 실행하는 환경에서 다음과 같이 코드를 작성해 실행하면,
def sleep_thread_test():
from threading import Thread
import datetime
def handler():
while True:
print(datetime.datetime.now().time(), "time.sleep - start")
time.sleep(2)
print("time.sleep - end")
t = Thread(target=handler)
t.daemon = True
t.start()
프로세스가 살아있는 한 화면에는 계속해서 다음과 같은 식으로 2초마다 로그가 반복되며 나옵니다.
13:23:53.153898 time.sleep - start
time.sleep - end
13:23:55.160563 time.sleep - start
time.sleep - end
13:23:57.166585 time.sleep - start
time.sleep - end
13:23:59.177951 time.sleep - start
time.sleep - end
13:24:01.181321 time.sleep - start
또한, 이것을 Django 같은 환경으로 포팅해 개발해도 같은 결과를 가져옵니다. 다소 억지스럽지만 요청에 대해 처리하는 handler에서 다음과 같이 작성을 해도,
def sleep_thread_test(request):
from threading import Thread
import datetime
def handler():
while True:
print(datetime.datetime.now().time(), "time.sleep - start")
time.sleep(2)
print("time.sleep - end")
t = Thread(target=handler)
t.daemon = True
t.start()
return render(request, 'test/sleep_thread_test.html', {'result_set': "OK"})
기본 파이썬 호스팅으로 실행하면 의도한 대로 잘 동작합니다. 하지만, 이것이
uwsgi 호스팅 환경으로 변경되면 다음과 같이 단 한 줄의 로그만 찍힙니다.
04:25:07.777354 time.sleep - start
표면상으로 저 상황만 놓고 보면 마치 time.sleep에서 hang이 걸린 듯한 모습을 보이는 것입니다. 재미있는 것은, 동일한 Django 프로그램을
gunicorn에서 호스팅하면 다시 스레드 루프가 잘 동작해서 로그가 2초마다 찍힙니다. (위의 예제에서는 time.sleep을 했지만, socket.recv 등의 함수를 실행해도 마찬가지입니다.)
그러니까, 호스팅 환경에 따라 저 코드의 동작 유무가 결정되는 것입니다. 참고로, uwsgi에서 이 문제를 해결하려면 "--enable-threads" 옵션을 지정하면 되는데, 이에 대한
좀 더 자세한 내용은 다음에 ^^ 이어서 하겠습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]