디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2025.10.29 01:28:46
조회 301 추천 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/11/10 - -
AD 겨울가전 SALE! 쿨한 겨울 HOT세일 운영자 25/11/12 - -
2900537 si퇴사했다 [5] ㅇㅇ(118.235) 11.04 207 0
2900533 상법개정안과 함께 노동개혁도 따라가야지 chironpractor갤로그로 이동합니다. 11.04 93 0
2900527 CGV 1인 관람권 할인중이야 [1] ㅇㅇ(49.254) 11.04 118 0
2900525 러스트충에게 우스이가 보이는구나. [5] 헬마스터갤로그로 이동합니다. 11.04 142 0
2900520 물 들어올 때 노 저어야지 chironpractor갤로그로 이동합니다. 11.04 73 0
2900515 재매이햄 근데 유능하시네. 재미이햄 때문에 요새 키움증권 자동매매 [4] ㅆㅇㅆ(104.28) 11.03 150 0
2900510 방구석 히키코모리 개발자들 있니? 옵톡방 프갤러(112.168) 11.03 91 0
2900508 경력자인데 db설계 안해봤는데 어렵냐 [5] ㅇㅇ(211.196) 11.03 132 0
2900503 간만에 낮에 코노 잠깐 들렀었는데 chironpractor갤로그로 이동합니다. 11.03 67 0
2900502 으음... 카카오 로그인 붙여보려다가 뭔가 현실의 벽 느꼈다. [3] 프갤러(110.8) 11.03 114 0
2900495 나랑 성향 맞는 사람이랑 일하고 싶다 [1] ㅇㅇ(121.162) 11.03 101 0
2900486 사람 만나는거 자주 하는거 중요함 chironpractor갤로그로 이동합니다. 11.03 78 0
2900480 판교 이새끼들은 허세 가오충만 있는 거냐? [2] ㅇㅇ(185.213) 11.03 140 0
2900475 울산 1인 창업하면 1년동안 사무실 공짜로 쓸 수 있다던데 ㅆㅇㅆ(104.28) 11.03 75 0
2900469 거절이유 표면상의 사유는 대학원 상경한다고 [5] ㅆㅇㅆ(104.28) 11.03 102 0
2900466 PC 디시 차단설정 이해가 안가네 [2] ㅇㅇ(122.199) 11.03 77 0
2900465 내 인생에서 유일하게 여자 딱 한번 사겨볼 수 있었던 기회는 [11] ㅆㅇㅆ(104.28) 11.03 149 0
2900460 이제부터 MBTI 질문에 없다고 답한다 [1] 헬마스터갤로그로 이동합니다. 11.03 76 0
2900458 늬들은 모르겠지만 사실 [12] 배구공(119.202) 11.03 95 0
2900440 노트북 사려는데 14인치도 괜찮음? [2] 프갤러(119.204) 11.03 92 0
2900434 올해 비동일계에서 컴공으로 편입했는데 [2] 프갤러(114.203) 11.03 105 0
2900432 클라우드 플레어 warp이거 확실히 성능늘어나네 [1] ㅆㅇㅆ찡갤로그로 이동합니다. 11.03 105 0
2900431 마스터플랜의 망령 [1] ㅇㅇ(211.216) 11.03 71 1
2900430 근데 뭐 나도 똥물을 치우는 쪽보단 뿌리는 쪽일듯 [2] 프갤러(27.177) 11.03 91 0
2900428 오늘 저녁은 전복죽 chironpractor갤로그로 이동합니다. 11.03 51 0
2900426 흠 KT로 폰으로 해보니까 되네 ㅆㅇㅆ(124.216) 11.03 62 0
2900425 소프트웨어 난개발이라는게 스타로치면 세빠닥 테크 타놓고 프갤러(27.177) 11.03 83 0
2900424 아이큐 근데 의미 없지 않냐? 아이큐 276이 지구평평론 말하던데 [3] ㅆㅇㅆ(124.216) 11.03 106 0
2900420 한국은 전문가에 대한 불신이 팽배해있다. [1] 프갤러(223.55) 11.03 77 1
2900418 If 중첩 될일이 없는데 개초보라 그런거임? [5] 프갤러(106.101) 11.03 92 0
2900417 서버는 살아있는데 검색 api만 뒤진거같은데 [1] ㅆㅇㅆ찡갤로그로 이동합니다. 11.03 55 0
2900416 Ai로 프론트 디자인 트렌디하게 뽑는 방법이뭐임? [1] 프갤러(106.101) 11.03 75 0
2900415 대학교 2학년 자바 팀플 주제 뭐해야될까요? [2] 프갤러(220.73) 11.03 79 0
2900414 한국에 제대로 된 프로그래머가 적은 이유 [8] 프갤러(223.63) 11.03 730 11
2900413 애들아 미안한데 지금 국립 중앙도서관 api 나만 작동 안하냐? ㅆㅇㅆ(124.216) 11.03 69 0
2900412 버전같은건 좀 넉넉하게 쓰면안돼나 [1] ㅇㅇ(59.31) 11.03 85 0
2900410 지금 국립중앙도서관 api가 동작을 안하노 ㅆㅇㅆ찡갤로그로 이동합니다. 11.03 74 0
2900409 시대가 어느 시대인데 아직도 MFC 를 사용하냐 [5] 프갤러(59.16) 11.03 105 0
2900408 나는메가 스톤 얻을 수 있을까 [2] 넥도리아(223.38) 11.03 61 0
2900407 왜 한국에 제대로 된 프로그래머가 없는 줄 암?? [7] ㅇㅇ(222.108) 11.03 168 2
2900406 파이썬 3.14 받으면 안됨? [3] 오스카갤로그로 이동합니다. 11.03 104 0
2900405 저녁에 [1] 배구공(119.202) 11.03 83 0
2900404 여기가 원종 형님 갤러리 인가요? [2] 프갤러(59.25) 11.03 96 0
2900403 근데 요즘 서비스기업들 다 죽은거같은데 [5] 프갤러(211.234) 11.03 130 0
2900401 자가로 커피 사서, T day 개인컵으로 뜨거운 뜨듯한 아메리카노. et 넥도리아2025(14.35) 11.03 43 0
2900400 주변 사람이 쩝쩝충이면 어찌 생각함 [16] 루도그담당(58.239) 11.03 148 0
2900399 오늘의 테트리스 배구공(119.202) 11.03 79 0
2900398 안녕~ [11] 마호로갤로그로 이동합니다. 11.03 118 0
2900397 저수준 뽕 맞아버린 애들이 많구나 [4] 루도그담당(58.239) 11.03 128 0
2900396 [애니뉴스] 블로그 유입 - 검색 등록 방법 프갤러(121.172) 11.03 57 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2