디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

에이도비야. 경력 15년 인정이야한다만 개념적으로 틀렸다. 설명해줌

ㅆㅇㅆ(124.216) 2025.10.29 01:28:46
조회 359 추천 0 댓글 0
														

1. 니가 작성한 테스트의 문제


lru_cache는 메모이제션 캐싱이고


lambada_:store_instance 는 'DI 컨테이너를 통한 애플리 케이션 스코프 싱글톤 인스턴스임'


이 캐싱차이는 너도 알거라 생각한다. 인스턴스 캐싱을 말하는데 왜 자꾸 메모이제션 캐싱을 이야기하냐 FAST API가 원하는 양식을 구현하는거임


2.asyncio.gather는 단일스레드내 비동기 동시성임


내가 테스트하려는건 parallelism임


이 상황에서 변경가능한(mutable)상태를 공유하는 싱글톤은 데이터 레이스가 발생함


3. 실행모델에 대한 오해


unvicorn -- worker2 같이 별개 os 프로세스 2개 띄우는건데 이게 뭐가 문제임? 당연히 메모리간 이고


4. Depends 방식은 리퀘스트 스코프(웹) 방식이고, 이건 VectorStore는 애플리케이션 스코프다.


FastAPI에서도 lifeSpan 쓰라고 한다.


import concurrent.futures
import threading
import time

# --- 1. '에이도비'가 주의해서 쓰면 된다는 '가변 싱글톤' ---
# (예시로 든 'dict'처럼 '가변 상태(counter)'를 가짐)

class NaiveMutableSingleton:
    _instance = None
   
    def __new__(cls):
        # 고전적인 싱글톤 구현
        if cls._instance is None:
            time.sleep(0.0001) # 스레드 충돌을 유도하기 위한 약간의 딜레이
            cls._instance = super().__new__(cls)
            cls._instance.counter = 0 # <-- 이것이 '공유된 가변 상태'
        return cls._instance

    def increment(self):
        """
        이 함수는 '스레드 안전(Thread-Safe)'하지 않는다
        """
        current_val = self.counter  # 1. 값 읽기 (Read)
       
        # --- 위험 구간 (Critical Section) ---
        # 이 시점에 다른 스레드가 끼어들어 'current_val'을 동시에 읽을 수 있음!
        time.sleep(0.0001) # 다른 스레드가 끼어들 시간을 강제로 만듦
        # --- 위험 구간 끝 ---
       
        self.counter = current_val + 1 # 2. 값 쓰기 (Write)

# --- 2. '에이도비'의 테스트(asyncio)가 아닌, '진짜 병렬' 테스트 ---
# 멀티 스레드 (ThreadPoolExecutor)를 사용

NUM_THREADS = 10     # 10개의 스레드 (병렬 에이전트)
NUM_TASKS_PER_THREAD = 100 # 각 스레드가 100번씩 작업
TOTAL_TASKS = NUM_THREADS * NUM_TASKS_PER_THREAD # 총 예상 값 = 10 * 100 = 1000

print(f"--- '가변 싱글톤' 병렬 안정성 테스트 ---")
print(f"{NUM_THREADS}개의 병렬 스레드(에이전트)가 싱글톤의 counter를 {NUM_TASKS_PER_THREAD}번씩 총 {TOTAL_TASKS}번 증가시킵니다.")
print("('에이도비' 주장: '주의해서 쓰면' 문제없다)")
print("('내' 주장: '가변 싱글톤'은 병렬 환경에서 데이터 경쟁을 일으킨다)\n")

def run_task(task_id):
    s = NaiveMutableSingleton()
    for _ in range(NUM_TASKS_PER_THREAD):
        s.increment()
    # print(f"스레드 {task_id} 완료...") # 주석 해제 시 더 복잡하게 얽힘

# 진짜 병렬 실행
with concurrent.futures.ThreadPoolExecutor(max_workers=NUM_THREADS) as executor:
    futures = [executor.submit(run_task, i) for i in range(NUM_THREADS)]
    concurrent.futures.wait(futures)

# --- 3. 결과 ---
final_counter = NaiveMutableSingleton().counter

print("\n--- 테스트 결과 ---")
print(f"예상 최종 값 (기대 값): {TOTAL_TASKS}")
print(f"실제 최종 값 (측정 값): {final_counter}")

if final_counter == TOTAL_TASKS:
    print("\n결과: ✅ 성공 (이론상 거의 불가능한 확률)")
else:
    print(f"\n결과: ❌ 대실패! (값이 깨짐)")
    print(f"이유: {TOTAL_TASKS - final_counter}번의 쓰기(write) 작업이 '데이터 경쟁'으로 인해 유실됨.")
    print("이것이 '공유된 가변 상태'를 병렬로 접근할 때의 위.")

print("\n--- 결론 ---")
print("1. '에이도비'의 `asyncio.gather` 테스트는 '단일 스레드' 비동기라 이 문제를 발견조차 못함")
print("2. '주의해서 쓴다'는 말은, 모든 'increment' 함수에 'Lock'을 걸어야 한다는 뜻이며, 이는 코드를 복잡하게 하고 성능을 저하시킴.")
print("3. 내 방식(DI + Lifespan)은 애초에 이런 '가변 상태'를 공유하지 않고,")
print("   '스레드 세이프'하거나 '불변'한 객체의 '참조'를 주입하므로, 아키텍처 수준에서 이 위험이 없음.")



24b0d121e09c28a8699fe8b115ef0469933efebd


다시한번 말하지만 리소스 정리 빼먹은거 지적해준거 고맙게 생각함


그냥 어차피 꺼지면 리소스 정리되니까 빼먹었는데 명시적으로 넣는게 맞지.


근데 그건 그거고 


이건 이거임.


너는 자꾸 '다중 이용자가 쓴다' 이걸로 착각하는데


그게 아님.


추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 이제는 의미 없어진 것 같은 시상식은? 운영자 25/12/01 - -
AD 루틴 ON! 운동 찐템! 지금 할인 중 운영자 25/11/27 - -
2905248 러스트를 접한건 우연이지만 빠는건 필연이다. [1] 프갤러(110.8) 11.28 89 0
2905246 내가 만나고 싶은 여자 이상형 적어봄.txt [1] ㅁㅁㅅ갤로그로 이동합니다. 11.28 95 0
2905242 러스트 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 11.28 74 0
2905240 러스트 러스트 러스트 러스트 러스트 러스트 프갤러(221.149) 11.28 69 0
2905239 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 72 0
2905238 내 컴터 상태가 이럴듯..ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 11.28 98 0
2905236 다들 이정도 정신문제는 가지지 않나 ㅇㅇ(39.7) 11.28 89 0
2905234 작년 이맘때 폭설 ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 11.28 78 0
2905231 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 11.28 72 0
2905230 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 11.28 69 0
2905227 그레셤의 법칙이 더닝크루거에 선행한다 [29] chironpractor갤로그로 이동합니다. 11.28 143 0
2905224 맨날 뭐 망하라는 소리만 하면서 왜 자기가 애국자인척을 하지 ㅇㅇ갤로그로 이동합니다. 11.28 61 0
2905221 인지과학조져라 손발이시립디다갤로그로 이동합니다. 11.28 75 0
2905219 김영회 동국대 향가연구실장 "양주동 박사 향가 해독법 틀렸다" 발명도둑잡기(39.7) 11.28 62 0
2905218 일본 '만엽집' 대가 "일본은 아름다운 평화를 지향해야 한다" 발명도둑잡기(39.7) 11.28 63 0
2905217 양쪽 얘기 듣자는게 왜 역사왜곡임? [5] chironpractor갤로그로 이동합니다. 11.28 144 3
2905216 박원순 자ㅡ살 맞는지가 의문 [1] 발명도둑잡기(39.7) 11.28 81 0
2905215 스위스는 매달 전국민이 우편투표로 직접민주정치 발명도둑잡기(39.7) 11.28 64 0
2905214 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 52 0
2905212 죽어가는 국민의힘 되살리는 기초의회 ‘2인 선거구’, 더 늘어나나 발명도둑잡기(39.7) 11.28 68 0
2905211 재명이 존나 찐따같네;; 카메라 보이니까 왕따 아닌척 발악;; [5] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 96 0
2905210 진보당, 무주택자·세입자·청년의 ‘감당 가능한 주거’ 7대 정책 제안 [1] 발명도둑잡기(39.7) 11.28 78 0
2905208 경력기술서쓰는데 궁금한거 있음 [7] 프갤러(58.76) 11.28 121 0
2905207 미국 음반 시장 순위 조작을 위한 사재기 있나 발명도둑잡기(39.7) 11.28 160 0
2905203 <하우스 오브 다이너마이트> 인기래서 생각나는 예전 글 발명도둑잡기(39.7) 11.28 63 0
2905200 오늘의 소설, 영화 실마리: 초코파이 재판과 노조원 이야기 발명도둑잡기(39.7) 11.28 62 0
2905195 이익 배분 게임과 지능의 상관관계 [1] 발명도둑잡기(39.7) 11.28 103 0
2905193 넷마블 해킹 SQL 인젝션 추정 [1] ㅇㅇ(175.197) 11.28 113 0
2905191 넥스트 N.EX.T-Dear America 무삭제 발명도둑잡기(39.7) 11.28 69 0
2905190 아니 잼미니 미친년 지맘대로 배포 해버리네 ㅋㅋ 프갤러(218.236) 11.28 87 0
2905187 슈베르트-마왕 발명도둑잡기(39.7) 11.28 55 0
2905186 제리케이-마왕 발명도둑잡기(39.7) 11.28 53 0
2905185 요즘 어셈으로 짤 일이 많아서 그런가 [1] 루도그담당(58.233) 11.28 97 0
2905184 수이 블루비드 다녀옴 [1] 따당갤로그로 이동합니다. 11.28 99 0
2905181 나님 콧대가 그렇게 이뽀..? 따당갤로그로 이동합니다. 11.28 117 0
2905179 독도 간접 언급한 中, 포털사이트·AI도 “독도는 한국 땅” 발명도둑잡기(39.7) 11.28 64 0
2905178 페이커닮은 개발자 찾습니다 [2] 프갤러(106.101) 11.28 125 0
2905177 언리얼 메뉴얼 진짜 거지같네 [4] 프갤러(114.205) 11.28 104 0
2905175 개발하냐고 글 쓸 시간도 없고 ㅁㅌ겠네 ㅠㅠ [4] 나르시갤로그로 이동합니다. 11.27 81 0
2905174 세계최초의 최상위 수준 C API 래핑 설계 패턴인가? 나르시갤로그로 이동합니다. 11.27 98 0
2905173 N-Arity 제네릭 래퍼 + 중앙 집중식 예외 매퍼' 아키텍처 나르시갤로그로 이동합니다. 11.27 67 0
2905172 Clair 라이브러리: 예외 처리 C 바인딩 아키텍처 [1] 나르시갤로그로 이동합니다. 11.27 104 0
2905171 옛날에 nuri.net이 뭐였더라 발명도둑잡기(39.7) 11.27 64 0
2905170 중국 딥시크가 미국 AI 압살하는중 ㄷㄷ [4] ㅇㅇ갤로그로 이동합니다. 11.27 121 0
2905169 ‘성폭력 발언’ 이준석 불송치에…“막말 자유권은 없다” 반발 봇물 발명도둑잡기(39.7) 11.27 72 0
2905168 민주당, '2인선거구로 쪼개기'에 합세한다면 내란본당 국민의힘 부활 발명도둑잡기(39.7) 11.27 71 0
2905167 뭔가 소화가 잘 안된느낌 [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 99 0
2905166 [애니뉴스] YxD Labs - 유튜브 링크 공유 ㅇㅇ(121.172) 11.27 61 0
2905165 MS 엣지브라우저 msn에 중요 노출되는 극우 황색지들 발명도둑잡기(39.7) 11.27 58 0
2905164 이세돌이 바둑 은퇴한거 이제 실감난다 [1] 프갤러(110.70) 11.27 83 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2