디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2025.10.29 01:28:46
조회 320 추천 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/17 - -
AD 겨울가전 SALE! 쿨한 겨울 HOT세일 운영자 25/11/12 - -
2899178 또또 쓸데없는걸로 싸우고 있다. 프갤러(218.154) 10.28 99 1
2899177 프리랜서의 장점 매 1주일마다 하나의 MVP 제품을 냄 [2] ㅆㅇㅆ(124.216) 10.28 127 0
2899176 현직인데 ai 쓰고 있다 [2] 프갤러(211.106) 10.28 151 0
2899175 여태껏 이직 10번 정도 하고 느낀건 chironpractor갤로그로 이동합니다. 10.28 121 0
2899174 바이브 코딩이란게 뭐임? [9] ㅇㅇ갤로그로 이동합니다. 10.28 180 0
2899170 점심 조촐하게 먹고 딸치고 작업해야긋다. [2] ㅆㅇㅆ(124.216) 10.28 113 0
2899169 좀 귀찮지만 왜 싱글톤을 안쓰고 람다캡쳐+DI를 쓴지 설명해줌 ㅆㅇㅆ(124.216) 10.28 120 0
2899167 요즘 보면 세상에는 솔직한 악이 많은거 같아 [6] ㅆㅇㅆ(124.216) 10.28 165 1
2899166 Fast API 자체에서도 DI를 권장함 ㅆㅇㅆ(124.216) 10.28 120 0
2899165 이 갤러리는 프갤이란 이름은 약하지않냐? [2] 헬마스터갤로그로 이동합니다. 10.28 126 0
2899164 갑갑하다 ㅆㅇㅆ야 [5] 에이도비갤로그로 이동합니다. 10.28 192 0
2899163 핵은 핵이고 인간관계. 다 혐오병아니겠뇽. 넥도리아(211.201) 10.28 91 0
2899162 나는 요. 정은이 마음 믿는다. 넥도리아(211.201) 10.28 99 0
2899161 오늘도 책한권뗐다 [4] ㅆㅇㅆ(124.216) 10.28 150 0
2899160 지금까지 만든거 재현갤로그로 이동합니다. 10.28 85 0
2899159 카카오톡 리밴스드 어캐한거임?? [7] chironpractor갤로그로 이동합니다. 10.28 256 0
2899158 흠.. 담달은 뛰뛰 시간 잘 안나겠넹 [3] ♥벼락부자냥덩♥갤로그로 이동합니다. 10.28 123 0
2899157 개발자 취업할곳없냐 프갤러(39.117) 10.28 129 0
2899156 [플렉스튜디오/영림원소프트랩/멋쟁이사자처럼] 2025 로우코드 개발 공모 프갤러(14.32) 10.28 102 0
2899153 실컷 webrtc 공부하고 나니 내게 필요한건 webrtc가 아니었다. 프갤러(218.154) 10.28 98 0
2899152 의외로 게시판 만들려면 알아야하는게 많음 [2] 프갤러(218.154) 10.28 138 0
2899151 컴공 나왔는데 게시판 못만드는 애들 있음? [2] 프갤러(117.111) 10.28 171 0
2899149 수술... 허리 up 아니고 , no name 넥도리아(211.201) 10.28 117 0
2899147 다음 ada 플밍에는 asm 인테페이스 다뤄야겠어 ㅋㅋ 나르시갤로그로 이동합니다. 10.28 104 0
2899146 뉴스 헤드라인 읽어서 관련 종목 추리고 나르시갤로그로 이동합니다. 10.28 86 0
2899145 좋은 주제 찾있다 [2] 프갤러(218.154) 10.28 128 0
2899144 폐기물 괸련 종목들 나르시갤로그로 이동합니다. 10.28 110 0
2899142 저능아가 개발문서 보면 하루아침에 전문가 되는거냐 그럼? [2] ㅇㅇ(118.235) 10.28 146 3
2899141 "개발 문서 보는것도 전문가지 병신아" [1] ㅇㅇ(118.235) 10.28 130 4
2899140 ㅆㅇㅆ 저 병신은 지가 그렇게 잘났으면 [2] ㅇㅇ(118.235) 10.28 140 3
2899139 하~ 이씨발년 [8] 개멍청한유라갤로그로 이동합니다. 10.28 156 0
2899138 openai알트먼 진성홍어임 타이밍뒷.통수한방(1.213) 10.28 74 0
2899137 나 애플디벨로퍼아카데미 4긴데 [1] 프갤러(121.151) 10.28 131 0
2899136 최근 일본의 우타이테 프로그램 수준 프로외노자갤로그로 이동합니다. 10.28 110 0
2899135 학생인데 진로 어케 잡아야되나요..? [2] 프갤러(121.133) 10.28 126 0
2899134 자러감..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 10.28 90 0
2899132 미리 알려드릴께요. 아하 운영진께 지식인 서비스 오늘 내일 수술인데 넥도리아(220.74) 10.28 94 0
2899131 군상(群像)의 일부..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 10.28 97 0
2899130 태연 ㅇㅅㅇ 잘못 올렸네.. 다시 올린다.. ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 10.28 112 0
2899129 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 10.28 112 0
2899126 childhood and manhood 배구공(119.202) 10.28 76 0
2899082 어셈블리 코드를 C 언어로 변환해주는 사이트가 있었던 것 같은데 아는 람 ㅇㅇ(115.23) 10.28 126 0
2899075 Ada 프로그래밍: 3.6 프라그마 (pragma) 나르시갤로그로 이동합니다. 10.28 97 0
2899074 거지 같은 면접 과제? 코테? 10시간 걸려 다 함.. ㅇㅇ갤로그로 이동합니다. 10.28 148 0
2899065 나는 모든사람이 나처럼 10년이상 대학병원을 다녔으면 좋겠음 타이밍뒷.통수한방(1.213) 10.28 99 0
2899052 나도 오늘은 외주가 있어서 밥벌이했는데 [2] ㅆㅇㅆ(124.216) 10.28 171 0
2899044 이런 잠시 잊고 있었군. 인류 지성의 발전이 곧 개개인의 사명. [3] 프갤러(110.8) 10.28 128 0
2899043 나도 돈많이 벌어서 내 LLM 만들고 싶어 나 LLM 만들 수 있을거같다 [1] ㅆㅇㅆ(124.216) 10.28 165 0
2899037 여자배구 마이너갤러리 매니저 해임요청 ㅇㅇ(211.235) 10.28 77 0
2899029 여자 버튜버들 구독자 1만도 힘든거같은데 [4] 헬마스터갤로그로 이동합니다. 10.28 146 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2