ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] 회의 분석 성능 개선 (node.js에서 파이썬 스크립트 실행하는 다양한 방법)
    졸업프로젝트 2021. 4. 10. 21:00

     

    프로젝트 주제를 간략하게 소개해 보자면,

    회의록 자동 작성과 분석을 제공하는 그룹형 화상 회의 플랫폼이다.

    화상 회의가 종료되면 작성된 회의 스크립트를 기반으로 태그 추출, 요약, 워드 클라우드 정보를 제공해준다.

     

    회의록 분석과 관련한 코드는 파이썬에서 이용 가능한 오픈 소스와 라이브러리를 이용하였기 때문에

    웹 서버를 작성한 자바 스크립트로 수정하거나 코드 자체를 개선하기에는 한계가 있었다.

     

    따라서 분석에 걸리는 시간을 줄이기 위해서

    node.js에서 파이썬 스크립트를 호출하는 방식과 파이썬 함수의 실행 구조를 수정하는 것을 고려하게 되었다.

     

     

     

    Python-shell 이용

     

    가장 먼저 'nodejs에서 python 스크립트 실행'을 검색해보면 나오는 것이 python-shell을 이용하는 것이다.

    사용하는 방법은 따로 포스팅해 두었다.

     

    + 스크립트 분리 실행

     

    처음에는 세 가지 분석을 한 스크립트로 작성하여 실행해보았다. (이건 실행 속도 측정을 못 하였다.)

    분석 결과를 하나로 모아 return해 주는 것이 성능을 저하시키는 것 같아

    이후에 자바스크립트의 비동기 실행을 이용하여 스크립트를 세 개로 분리하고 각각 실행해 보았다.

     

     

     

     

    child-process 이용

     

    python-shell과 비슷한 시도방법이다. 

    child-process를 생성하여 파이썬 스크립트를 실행하도록 하였다.

    실행 방법 역시 따로 포스팅해 두었다.

     

    파이썬 스크립트를 매번 프로세스를 생성하여 따로 돌려주는 것도

    다수의 사용자와 다수의 상황을 고려해 봤을 때 적합한 방법이 아닌 듯했다.

     

     

     

     

    flask 이용

     

    위의 두 방식과는 결이 다른 방법이다.

    플라스크 서버를 구동한 뒤 node.js 서버에서 요청을 보내고 응답을 받아오는 방식이다.

    실행 방법은 포스팅해 두었다.

     

    확실히 위의 두 방법보다는 실행 속도가 빨랐다.

    하지만, 스크립트를 실행하기 위해서 서버를 따로 돌린다는 점이 마음에 걸렸다.

     

     

    + 파이썬 스크립트 multiprocessing 이용 (여기서 정말 바보 같은 시도를 한다..)

     

    내가 시도해 보고 싶었던 건 플라스크 서버를 돌리고 분석을 병렬적으로 실행하는 것이었다.

    근데 여기서 스크립트를 세 개로 쪼갠 뒤 세 번의 요청을 보낸 것이 아니라

    '한 번의 요청을 보낸 뒤 multiprocessing을 이용하여 각 함수를 병렬 실행해볼까?'라고  한 것이다.

     

    하나의 요청에 대해선 한 번의 응답만 보낼 수 있기 때문에

    각 메서드를 병렬로 실행한 뒤 결과값을 모아주기 위해서 공유 변수를 사용하게 되었다.

     

    그 결과, multiprocessing의 장점은 이용하지 못하고 실행 속도는 더욱더 느려지게 되었다.

     

     

     

    Redis 이용

     

    파이썬 프로세스를 띄워두고 요청을 이벤트로 생각하여 처리하면 어떨까?

    Redis의 메시지 큐를 이용하여 구현해 보았다.

    구현 방법은 포스팅해 두었다.

     

    확실히 이벤트로 데이터를 수신하는 것이 성능이 가장 좋았다.

     

     

    + 파이썬 멀티스레드 이용

    각 분석은 변수를 공유하지 않는다는 점을 이용하여 각 함수를 서로 다른 스레드를 이용하여 실행하도록 하였다.

    하나의 메시지에 대해 병렬적으로 분석을 수행하고 각각의 결과는 따로 publish 해준다.

    이후, 모든 메시지를 수신하였을 때 DB에 넣도록 하였다.

     

    성능의 결과는 가장 좋았다.

     

     

    결론

     

    결과적으로, 실행 속도는 다음과 같은 순서로 효율적이다.

    Redis+multit-hread < flask < child-process < python-shell

     

    flask의 경우 병렬 처리된 경우를 측정해 보진 못했지만, 서버를 따로 띄운다는 단점이 있다.

    Redis는 속도 면에서 우수성을 보이기 때문에

    만약 node.js와 파이썬 스크립트가 주고받는 데이터의 크기가 더 커지는 경우 Redis가 훨씬 좋은 성능을 보여줄 것이다.

     

     

     

     

    아쉬운 점

     

    성능을 비교하고 나니 들었던 아쉬운 점은

    테스트 전문 툴을 사용하지 않고 console.time을 이용하여 단순 코드 실행 시간만 측정했다는 것이다.

    다음 기회에는 테스트 전문 툴을 사용하여 보다 전문적으로 성능을 비교해야겠다고 생각했다.

    댓글

Designed by Tistory.