- 작성시간 : 2014/09/15 15:36
- 퍼머링크 : mcchae.egloos.com/11130061
- 덧글수 : 0
예전에 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를 이용하여 문제를 해결할 수 있다는 결론이었습니다.
어느분께는 도움이 되셨기를...



덧글