Zettelkasten

Gevent에서 threading local이 문제가 되는 이유 - 거짓

·수정 2026.04.23·수정 3

요약

본문

  • threading.local은 스레드 마다 독립적인 저장소를 제공한다.
    • os 스레드 id를 키로 잡아서 데이터 분리
  • gevent는 경량 스레드인 greenlet을 스케줄하고, 모든 greenlet은 Gevent kernel 스레드를 보게됨
    • 동시 처리되고 있는 요청들은 동일한 threading local을 봄
  • 왜 gevent.monkey.patch_all()은 threading 모듈을 monkey patch하는데 문제가 되는가?
    • 사실 문제가 안된다고 한다. 내가 착각해서 그렇게 된 거임. 사실 grpc가 문제였던거야!
import gevent
from gevent import monkey
import threading

# --- patch 전 ---
print("Before monkey.patch_all()")
local1 = threading.local()
local1.value = "main-thread"

def show_before():
    print("[before] in greenlet:", getattr(local1, "value", None))

g = gevent.spawn(show_before)
g.join()

# --- patch 후 ---
monkey.patch_all()

print("\nAfter monkey.patch_all()")
local2 = threading.local() # 새로 만든 local

def task(name):
    local2.value = name
    gevent.sleep(0) # 다른 greenlet에 컨텍스트 양보

print(f"[after] {name} sees:", local2.value)
g1 = gevent.spawn(task, "greenlet-1")
g2 = gevent.spawn(task, "greenlet-2")
gevent.joinall([g1, g2])