[Python] gevent 와 ZeroMQ 혼용하기 Develop Tip

예전에 gevent를 이용한 UdpServer 를 구성해 본 적이 있습니다.

파이썬에서는 GIL 때문에 발생할 수 있는 쓰레드 Concurrency를
마치 JavaScript의 비동기 함수 호출처럼 Parrellism을 단일 쓰레드로 구축할 수 있도록
해 줍니다.

그런데 문제는 greenet를 이용한 gevent 프로그램을 하더라도,
때에 따라, 

impossible to call blocking function in the event loop callback

라는 예외가 발생하는 문제가 있었습니다.

이를 해결하기 위하여 여러 가지 방법을 써 보았었습니다.

UDP 핸들러에서 UDP 패킷을 받으면,
각각 분기된 종류별로 메모리에 넣었다가,
외부 시그널에 의해서 파일에 쓰고 하는 등의
작업을 하는 것으로 

메모리 큐를 위하여 

from gevent.lock import RLock

도 이용해 보았고,
파일 I/O는 non-blocking 이 안되지만,

from gevent import monkey; monkey.patch_all()

도 적용해 보았으나 모두 문제가 발생했습니다.

결론은 ZeroMQ의 IPC 소켓을 이용하여 아주 깔끔이 해결할 수 있었습니다.

기존 위와 같이 로그 저장을 하던것을 

와 같이 ZMQ를 이용하여 서비스를 받고 동일 한 대응을 하도록 하였고,

원래 자리에는

와 같이 ZMQ 요청을 함으로써 깨끗이 문제 해결을 할 수 있었습니다.

결론은 gevent에서 I/O 를 과도하게 사용하는 것들은
별도의 ZeroMQ를 이용하여 문제를 해결할 수 있다는 결론이었습니다.


어느분께는 도움이 되셨기를...

덧글

댓글 입력 영역

구글애드텍스트