안녕하세요 깍돌이입니다.

 

기존 포스팅에 이어서 

 

바로 다음 포스팅에서는 최대워커 수만큼 호출시 와 지금 은 함수를 return new Promise로 해서 Promise.all 로 받았지만

사실 진짜 원하는건 멀티스레드아니였나 

A , B함수에서A가 계속 루프돌고 CPU 연산을 하면 B는 실행도 못하는게 실행되는게 아니였나? 

라는 저만의 질문에 답을 하기 위한 포스팅입니다.

일단 다시 한번 제가 하려고했던 기능을 정리하겠습니다.

A 함수

0.2초마다 A라는 배열을 채웁니다.

B 함수

0.2초마다 A라는 배열에 값이 차면 꺼내와서 테스트 플랫폼에 해당 내용으로 자동화를 요청합니다.

기존 포스팅에서 return new Promise로 했었기 때문에 사실 멀티스레드를 흉내내는지 궁금했습니다.

5개의 함수가 각각 CPU 연산을 할 경우 어떻게 되는가? 입니다.

 

그럼 실제 연산을 해야되니까 

 

워커 코드를 아래와같이 변경하였습니다.

Worker.js

'use strict'

// 테스트 용 
let memoryArray = [];

let worker ={
  today_resource_filtering,
  filtered_resource_request_automation,

  today_resource_filtering_node_fn,
  filtered_resource_request_automation_node_fn,

  dummy_fn,
}

let g_closeCondition =100000000;

function today_resource_filtering_node_fn(){
      let i=0;
      let calculatorNumber = 0;
      console.time('today_resource_filtering_node_fn');
      while(true && i < g_closeCondition){
        i++;
        calculatorNumber+=i;
      }
      console.timeEnd('today_resource_filtering_node_fn');
      console.warn(calculatorNumber);
}

function filtered_resource_request_automation_node_fn(){
      let i=0;
      let calculatorNumber = 0;
      console.time('filtered_resource_request_automation_node_fn');
      while(true && i < g_closeCondition){
        i++;
        calculatorNumber+=i;
      }
      console.timeEnd('filtered_resource_request_automation_node_fn');
      console.warn(calculatorNumber);
}

function dummy_fn(name){
  let increNumber=0;
  console.warn(`========Start ${name}`);
  for(let i=0;i<g_closeCondition*50;i++){
      increNumber+=i;
  }
  console.warn(`========End Dummy Fn ${name}`);

}





module.exports = worker;

 

Node.js ( basic ) 

단순 호출하는 Node.js 입니다. 

let worker = require('./filter_and_request.js');

console.time('using_basic_js');

// 1억 까지 더하는 함수 
console.warn('---------------------Start Today Resource node fn')
worker.today_resource_filtering_node_fn();
console.warn('\r\n');

// 1억 까지 더하는 함수 
console.warn('---------------------Start filtered_resource_request_automation node fn')
worker.filtered_resource_request_automation_node_fn();
console.warn('\r\n');

// 50억 까지 더하는 함수 5번 호출 
for(let i=0;i<5;i++){
  console.warn(`-------------Start dummy calculator fn ${i+1}`);
  worker.dummy_fn(i+1);
  console.warn('\r\n');
}

console.timeEnd('using_basic_js');

 

 

Piscina 사용

const path = require('path');
const Piscina = require('piscina');

const piscina = new Piscina({
  filename:path.resolve(__dirname,'filter_and_request.js')
});

console.time('using_Piscina_js');

// 1억 까지 더하는 함수 
console.warn('---------------------Start Today Resource node fn')
piscina.run({},{name:"today_resource_filtering_node_fn"});
console.warn('\r\n');

// 1억 까지 더하는 함수 
console.warn('---------------------Start filtered_resource_request_automation node fn')
piscina.run({},{name:"filtered_resource_request_automation_node_fn"})
console.warn('\r\n');

// 50억 까지 더하는 함수 5번 호출 
for(let i=0;i<5;i++){
  console.warn(`-------------Start dummy calculator fn ${i+1}`);
  piscina.run(i+1,{name:"dummy_fn"});
  console.warn('\r\n');
}

console.timeEnd('using_Piscina_js');

 

dummy_fn 의 시간을 재기 위해 console.time을 추가했습니다.

function dummy_fn(name){
  let increNumber=0;
  console.warn(`========Start ${name}`);
  console.time(`Check Time ${name}`)
  for(let i=0;i<g_closeCondition*50;i++){
      increNumber+=i;
  }
  console.warn(`========End Dummy Fn ${name}`);
  console.timeEnd(`Check Time ${name}`)

}

 

결과

Node.js 호출  ( 순차적으로 실행되며 -  57초 발생

밑에 57초라는게 결국 console.time에서 console.timeEnd가 만나는 시점에 결정되는건데 결국 앞단의 함수들이 CPU 를 집약적으로 사용하고있으면 뒤에 함수는 실행도 못하고 대기하고 있다는 뜻이 됩니다. 

100ms + 100ms + 5s + 5s + 15s + 15s + 15  = 대략 57000 = 57초  ( 동기식 ) 

Piscina 호출 

일단 코드 Blocking되는 부분이 없습니다. using_Piscna_js가 6ms입니다 ( 6s아니고 6s  0.06초입니다. )

이부분을 보면 테스트를 해야하는 코드는 바로 실행하고 넘어갔음을 알수 있습니다.

 

이로써 Piscina가 worker thread 를 정상적으로 잘 쓰고있는지 정말 worker thread pool 은 기존의 노드 코드를 Blocking하지 않는지 직접 확인해봤는데요 

 

마지막 포스팅은 제가 원래 하려고했던 작업 ( 하나의 배열을 한쪽은 계속 필터링해서 넣고 -> 한쪽은 배열 차면 꺼내서 테스트 자동화 플랫폼에 테스트 요청을 보내는 ) 에 대한 코드를 올리겠습니다.

 

 

 

 

+ Recent posts