요약
- 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 해