반응형

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

+ Recent posts