약 1달 전부터 이직을 하기위해 FA로 나왔고, 다행히 몇 몇 회사들의 면접을 볼 수 있었다.
대부분은 면접에서 탈락했지만... 돌이켜 보면 준비가 미흡했던 것도 있고 경력직 면접인 만큼 고민하지 않고 개발했다면 뚫어내기가 쉽지 않은 경우가 많았던것 같다.
위기를 기회로 삼아, 면접때 받은 질문들을 바탕으로 기본기를 다져 보려고 한다.
오늘 알아볼 것은 with 문을 사용하는 것이다.
https://princeji-h.tistory.com/35
django - 동시성 문제 해결하기 (lock)
이번에 회사에서 사용하는 화상 회의툴을 줌으로 교체하는 업무를 맡아서 하던 중에, 튜터와 튜티가 동시에 수업 입장을 시도하는 경우에 각각 다른 방으로 인도하는 현상을 발견했다. 수업에
princeji-h.tistory.com
위 포스터를 보면 동시성 문제를 해결하기 위해 lock을 인위적으로 만들어 사용하게 되는데,
이 때 아래와 같이 lock을 취득하고 회수하는 함수를 로직의 시작과 끝에 호출하게 된다.
try:
VideoConferenceLock.get_lock('session_id', session_id)
with transaction.atomic():
# 회의방 생성
...
VideoConferenceLock.release_lock('session_id', session_id)
return Response
except:
VideoConferenceLock.release_lock('session_id', session_id)
만약에 위와 같은 로직을 다른 race condition이 발생하는 곳에서도 재사용 하려고 하면 어떻게 해야할까?
실제로 면접에서 들었던 질문인데, 제대로 답을 하지 못했다.
면접을 복기하면서 질문들을 정리하다가, 아 이거 with문을 만들어주면 될거같은데?? 하는 생각이 들었다.
찾아보니 with 문은 자원을 획득하고, 사용하고, 반납할때 유용하게 사용할 수 있는 문법 이라고 한다.
with문은 다음과 같이 작성하면 된다.
class Example:
# 사용할 자원 생성 및 획득.
def __enter__(self):
print("start.")
return self
# 자원 사용.
def print_number(self, num):
print(f"Number: {num}")
# 자원 반납 및 후처리.
def __exit__(self, exc_type, exc_val, exc_tb):
print("end.")
with Example() as ex:
ex.print_number(42)
ex.print_number(10)
# std out
start.
Number: 42
Number: 10
end.
위 내용을 만든 로직에 적용시켜 보자
class VideoConferenceLock:
def __init__(self, key):
self.key = key
def __enter__(self):
self.get_lock(self.key)
def __exit__(self, exc_type, exc_val, exc_tb):
self.release_lock(self.key)
def get_lock(self, session_id):
key = f'zoom_session_id:{session_id}'
while True:
# 해당 key가 레디스에 없으면 lock (1초마다 시도)
if cache.get(key) is None:
break
time.sleep(1)
cache.set(key, 1, 30) # 30초 간 유효
def release_lock(self, session_id):
key = f'zoom_session_id:{session_id}'
cache.delete(key)
VideoConferenceLock Class를 재정의한 이후, 아래와 같이 with 구문을 넣어서 get_lock 과 release_lock 을 자동으로 적용해줄 수 있다.
with VideoConferenceLock():
try:
with transaction.atomic():
# 회의방 생성
...
return Response
except:
...
Reference
'Python' 카테고리의 다른 글
Python - RabbitMQ, AMQP 다루기 with pika (0) | 2023.03.05 |
---|---|
Python - pythonic한 코드 작성(feat. 이직 후기) (0) | 2022.08.21 |
Python - 커스텀 정렬 (0) | 2021.11.02 |
Django - 다른 서버에 api 요청하기 (0) | 2021.10.14 |
Python - 정렬 커스터마이징 (0) | 2021.10.11 |