반응형
    
    
    
  gunicorn에 대해서 처음 작업해보았는데 성능을 개선해보아야했다.
worker라던지, gevent라던지 이런 부분에 대해서 알고있어야하는데
관련해서 추천할 블로그이다.
http://blog.hwahae.co.kr/all/tech/tech-tech/5567/
오늘의 집 테크 블로그인데 gunicorn에 대해서 공부하기 좋다.
나름 글이 잘읽히고 정보의 질이 좋다.
위 내용이 어느정도 읽히고 테스트를 해보았다면
오늘 에러관련내용해서 쓰는글을 이해하기 편할것이다.
문제가 되는 부분의 코드이다.
import logging.config
from gevent.monkey import patch_all
patch_all()
# 이 부분이 해결하기 위한 코드 
# import grpc.experimental.gevent as grpc_gevent
# grpc_gevent.init_gevent()
from flask import Flask
from config.default import CONFIG
from views.pixel_view import bp
from config.logger import LOGGING_CONFIG
from views.scheduler import scheduler, get_destination_template
def create_app():
    logging.config.dictConfig(LOGGING_CONFIG)
    if CONFIG['APP_ENV'] == 'PRODUCTION':
        logging.disable(logging.DEBUG)
    else:
        logging.disable(logging.NOTSET)
    ap = Flask(__name__)
    ap.url_map.strict_slashes = False
    ap.register_blueprint(bp)
    ap.config['SCHEDULER_API_ENABLED'] = True
    if not scheduler.running:
        scheduler.init_app(ap)
        scheduler.start()
        # break point
    **get_destination_template()**
    return ap
app = create_app()
logger = logging.getLogger('default')
if __name__ == '__main__':
    logger.info('APP START AND POLL START')
    app.run(port=5001)
위 코드를 보면 python cronjob도 돌리고있고 api서버의 기능도 있다.
스케줄링관련 프로세스에는 google 제품을 사용하는 코드들이 있다. bigtable요청관련된 부분이다.
그렇지만 위에 break point를 걸어보면 아래와 같은 코드에서 freezing이 걸린다.
def _run_channel_spin_thread(state):
    def channel_spin():
        while True:
            #freezing point 
            cygrpc.block_if_fork_in_progress(state)
            event = state.channel.next_call_event()
            if event.completion_type == cygrpc.CompletionType.queue_timeout:
                continue
            call_completed = event.tag(event)
            if call_completed:
                with state.lock:
                    state.managed_calls -= 1
                    if state.managed_calls == 0:
                        return
    channel_spin_thread = cygrpc.ForkManagedThread(target=channel_spin)
    channel_spin_thread.setDaemon(True)
    channel_spin_thread.start()
이 파일의 경로는 아래와 같다

grcp에서 프로세스를 fork하는 부분에서 freezing이 걸리는걸 확인하는 순간이다.
충돌이 일어난다고 볼수 있다.
이 부분을 해결하기 위해선 첫 코드에서 주석을 해제하는 코드를 작성해야한다.
import logging.config
from gevent.monkey import patch_all
patch_all()
# 이 부분이 해결하기 위한 코드 
import grpc.experimental.gevent as grpc_gevent
grpc_gevent.init_gevent()
from flask import Flask
from config.default import CONFIG
from views.pixel_view import bp
from config.logger import LOGGING_CONFIG
from views.scheduler import scheduler, get_destination_template
def create_app():
    logging.config.dictConfig(LOGGING_CONFIG)
    if CONFIG['APP_ENV'] == 'PRODUCTION':
        logging.disable(logging.DEBUG)
    else:
        logging.disable(logging.NOTSET)
    ap = Flask(__name__)
    ap.url_map.strict_slashes = False
    ap.register_blueprint(bp)
    ap.config['SCHEDULER_API_ENABLED'] = True
    if not scheduler.running:
        scheduler.init_app(ap)
        scheduler.start()
        # break point
    **get_destination_template()**
    return ap
app = create_app()
logger = logging.getLogger('default')
if __name__ == '__main__':
    logger.info('APP START AND POLL START')
    app.run(port=5001)
사용한 패키지 버전이다.
gevent = "~=21.8.0"
gunicorn = "~=20.1.0"
google제품과 사용 시 freezing현상이 있다면 이 부분을 확인해보면 도움이 될 거 같다.
'백엔드 > Python' 카테고리의 다른 글
| [Python]ModuleNotFoundError: No module named '_ctypes' (0) | 2021.01.04 | 
|---|