Zettelkasten

Gevent에서 grpc가 문제가 되는 이유

·수정 2026.04.23·수정 3

요약

  • gevent는 기본적으로 Cooperative Concurrency(협력적 동시성 모델)
  • python grpc Client는 c언어로 작성된 core engine을 python이 바인딩한 형태로 구현되어 있음
  • C core는 OS 레벨 소켓/스레드를 직접 사용하기 때문에 gevent의 스케줄링과 충돌 될수 있음

본문

  • 동기 스텁: RPC에서 클라이언트가 서버에 요청을 보낸 뒤, 서버가 응답을 반환할 때까지 기다리는 방식의 호출 객체
  • gevent는 파이썬 내의 동기적인 package들을 monkey patching함(threading, socket 등등)
  • grpc는 c 코어가 직접 epoll/kqueue를 쓰고 자체 스레드 풀에서 콜백을 돌림
  • gevent로 구성된 서버의 어떤 요청이 grpc를 통해 외부 API를 호출하는 케이스가 있다고 가정했을때 아래와 같은 상황이 펼쳐짐(뇌피셜)
    • 먼저 해당 요청을 greenlet으로 감쌈
    • greenlet은 hub가 비어 있을 때 실행됨
    • 실행중 grpc 호출 부분을 만나면, grpc c core에서 os 스레드를 생성함
    • 해당 요청은 백그라운드에서 진행됨, 요청이 완료되고 파이썬에 요청 결과를 전달하려고함
    • 다른 파이썬 코드가 CPU-bound/블로킹으로 GIL을 오래 잡아 호출 greenlet이 결과 수령/해결을 못 해서 deadline 초과 "
  • 내 생각에는 yield를 못해서 그런거 아닌가?
    • blocking 해