요약
본문
- threading.local은 스레드 마다 독립적인 저장소를 제공한다.
- 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])