초당 처리 횟수 제한을 위한 윈도우 함수 [Node.js / Javascript]

API 크롤링이나, 기타 데이터 수집을 위해서 함수 또는 특정 프로시저를 실행할 때 횟수제한에 걸리지 않도록 윈도우를 잡아서 처리하는 코드

 

다만, 이 코드는 setInterval을 사용하므로 CPU 소모량이 클 수 있다.

 

  1. 소스코드
    function AWS(limit, secs){
      this.list = [];
      this.limit = limit;
      this.window = secs*1000;
      this.push = function(a, b){
        this.list.push([-1, a, b]);
      }
      this.pop = function(){
        if(this.list.length==0) return "EMPTY";
        var now = new Date().getTime();
        var st = -1;
        for(var i = 0 ; i < this.list.length; i++){
          if(this.list[i][0]<0){
            st = i;
            break;
          }
        }
        if(st == -1) return "EMPTY";
        var windowStart = now - this.window;
        var cnt = 0;
        for(var i = st - 1; i >= 0; i--){
          if(this.list[i][0] < windowStart){
            this.list.splice(0, i+1);
            st -= i+1;
            break;
          }
          cnt++;
        }
        if(cnt > this.limit) return "LIMIT EXCEED, REMAINS : "+(this.list.length-st);
        this.list[st][0]=now;
        var result = this.list[st];
        return result;
      }
    }

    왜 AWS이냐면, 맨 처음 Window로 선언해서 var window = new Window()로 하니 개발자 모드에서 계속 기존 오브젝트와 겹쳐서 awindow쓰다가 그냥 AWS로 붙여버렸다.

  2. 사용 방법
    var limits = 6; //횟수
    var limitTime = 1; // 초당 제한
    
    var aws = new AWS(limits, limitTime);
    
    aws.push(함수이름, 매개변수);setTimeout(function(){
      var result = aws.pop();
      if(typeof(result)!='string'){
        result[0](result[1]);
      }
    }, limitTime*1000/limits);
    
    
    // ex)
    // function a(b,c,d){
    //   console.log(b*c+d);
    // }
    // aws.push(a,[b,c,d]);
    //
    // 혹은 기존 함수들이 존재한다면
    //
    // function _a(b,c,d){
    //   console.log(b*c+d);
    // }
    // function a(b,c,d){
    //   aws.push(_a,[b,c,d]);
    // }

    값을 스트링으로 한 이유는, 로그 찍어보려고 한것이고, 원한다면 undefined로 바꾸어서 if(result) 형태로 써도 무방하다.

    추가적으로 너무 setInterval의 값이 적으면 CPU 사용이 폭증한다.
    별로 CPU 리밋도 적고, 크게 코드 값어치가 없다 싶으면 이용하자.

 

jcdgods

누구게?

You may also like...

답글 남기기

Translate »