프로젝트 피드백에서 이메일 전송이 느리다는 피드백이 있었다.
시간상 반영하지 못하고 넘겼었는데 계속 마음에 남아서 프로젝트 후 시도를 해보려고한다.
02) 파이썬 스레드
[TOC] ## 프로세스와 스레드 운영체제에서 어떤 실행 프로그램이 실행된다는 것은 CPU, 메모리, SSD와 같은 컴퓨터 자원을 사용합니다. 따라서 운영체체제는 프로그램들이…
wikidocs.net
스레드는 프로세스의 실행 단위이다
프로세스는 하나 이상의 스레드를 가질 수 있다.
동시에 실행되는 여러 프로그램들을 잘 관리하는 작업을 스케줄링이라고 하는데 스케쥴의 단위로 스레드를 사용한다!
여러 개의 스레드를 사용하는 것을 멀티스레드라고 한다!
그래서 프로그램을 작성할 때 멀티스레드 형태로 구현을 하면 운영체제에 의해서 동시처럼 느껴지도록 스케줄링이 될 수 있기 때문에 성능이 더 좋아진다고 한다!
그래서 멀티스레드를 사용해보려고 했다!
하지만!
python은 GIL이라는 하나의 파이썬 인터프리터에서는 하나의 작업만 실행이 가능하도록 하는 기능이 있기 때문에
멀티 스레드로 프로그램을 짜도 다른 스레드로 들어가기전에 락이 걸려서 결국에는 하나의 스레드가 시분할 하는 효과가 나기때문에 시간상으로 큰 차이가 없다.
어떻게 해야할까 구글링을 하던 중
https://qkr0990.github.io/development/2016/10/27/django-asynchronous-mail-send.html
박병준의 개발이야기
코딩교육,서울대학교, 컴퓨터공학, 소프트웨어교육, 웹 개발, 박병준, 개발자
qkr0990.github.io
이 블로그를 참고했다
django는 기본적으로 send_mail() 함수를 제공해서 이메일 전송을 편리하게 해준다.
하지만 send_email은 synchrounous(동기) 작업이므로 함수 호출하여 결과가 나와야 return 되기 때문에 상당히 큰 딜레이가 발생한다.
그래서 블로그에서는 python의 자체의 threading을 이용해서 django의 send_mail을 비동기 작업으로 wrapping하는 방법을 사용했다.
그래서 이 부분을 thread를 이용해서 단축시켜보자!
import threading
class EmailThread(threading.Thread):
def __init__(self, email):
self.email = email
threading.Thread.__init__(self)
def run(self):
self.email.send()
...생략...
def create(self, validated_data):
del(validated_data['password2'])
user = super().create(validated_data)
password = user.password
user.set_password(password)
user.email_valid = False
user.is_active = False
user.save()
# 인증 이메일 전송
message = render_to_string('email_valid.html', {
'user': user,
'domain': 'http://127.0.0.1:8000',
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
plain_message = strip_tags(message)
mail_subject = "MMOP 이메일 인증 링크 보내드립니다"
to_email = user.email
email = EmailMessage(mail_subject, message, to=[to_email])
EmailThread(email).start()
email.content_subtype = "html"
return user
이렇게 처리를 하니 확실히 시간이 단축되었음을 느꼈다.
길게는 3~4초 정도 걸리던게 1초도 안걸리는 것 같았다! 좀 더 정확하게 체크해보기 위해 시간을 측정해봤다.
이메일을 전송하는 부분 앞뒤로 시간을 체크해봤다.
import math
import time
...생략...
start = time.time()
message = render_to_string('email_valid.html', {
'user': user,
'domain': 'http://127.0.0.1:8000',
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
plain_message = strip_tags(message)
mail_subject = "MMOP 이메일 인증 링크 보내드립니다"
to_email = user.email
mail.send_mail(mail_subject, plain_message, settings.EMAIL_HOST_USER, [to_email], html_message=message)
end = time.time()
print(f"{end - start:.5f} sec")
수정전
수정 후
3초 이상 줄어들었음을 확인할 수 있었다.
'프로젝트 > MMOP(추천시스템_최종프로젝트)' 카테고리의 다른 글
최종 발표, KPT 회고 (1) | 2022.12.30 |
---|---|
발표준비( ppt 작성 ) (0) | 2022.12.28 |
발표준비(ppt 준비) (0) | 2022.12.27 |
발표준비(피드백 정리) (0) | 2022.12.26 |
2차 사용자 피드백 반영(static 설정, S3 즉각 반영) (0) | 2022.12.24 |
댓글