IT TIP

다른 스레드에 영향을주지 않고 node.js에서 스레드를 잠자는 방법은 무엇입니까?

itqueen 2020. 12. 3. 21:33
반응형

다른 스레드에 영향을주지 않고 node.js에서 스레드를 잠자는 방법은 무엇입니까?


당으로 Node.js를 이벤트 루프 이해 , 지원을 단일 스레드 모델을 Node.js를. 즉, node.js 서버에 여러 요청을하면 각 요청에 대해 새 스레드를 생성하지 않고 각 요청을 하나씩 실행합니다. 내 node.js 코드의 첫 번째 요청에 대해 다음을 수행하고 노드에 새 요청이 들어오는 동안 두 번째 요청은 5 초의 휴면 시간을 포함하여 첫 번째 요청이 완료 될 때까지 기다려야 함을 의미합니다. 권리?

var sleep = require('sleep');
    sleep.sleep(5)//sleep for 5 seconds

두 번째 요청이 첫 번째 요청이 완료 될 때까지 기다릴 필요가 없도록 node.js가 각 요청에 대해 새 스레드를 생성 할 수있는 방법이 있습니까? 아니면 특정 스레드에서만 sleep을 호출 할 수 있습니까?


npm 모듈 sleep을 참조하는 경우 readme에서 sleep실행을 차단합니다. 그래서 당신이 옳습니다-그것은 당신이 원하는 것이 아닙니다. 대신 차단되지 않는 setTimeout 을 사용하고 싶습니다 . 다음은 그 예입니다.

setTimeout(function() {
  console.log('hello world!');
}, 5000);

es7 async / await를 사용하여이 작업을 수행하려는 사람에게이 예제가 도움이 될 것입니다.

const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));

const example = async () => {
  console.log('About to snooze without halting the event loop...');
  await snooze(1000);
  console.log('done!');
};

example();

각 요청에 비동기 요청이있는 루프가 있고 각 요청 사이에 특정 시간이 필요한 경우 다음 코드를 사용할 수 있습니다.

   var startTimeout = function(timeout, i){
        setTimeout(function() {
            myAsyncFunc(i).then(function(data){
                console.log(data);
            })
        }, timeout);
   }

   var myFunc = function(){
        timeout = 0;
        i = 0;
        while(i < 10){
            // By calling a function, the i-value is going to be 1.. 10 and not always 10
            startTimeout(timeout, i);
            // Increase timeout by 1 sec after each call
            timeout += 1000;
            i++;
        }
    }

이 예제는 다음 요청을 보내기 전에 각 요청 후 1 초를 기다립니다.


deasync 모듈을 고려하십시오 . 개인적으로 모든 기능을 비동기로 만드는 Promise 방법이 마음에 들지 않으며 키워드 async / await anythere가 마음에 들지 않습니다. 그리고 공식 node.js는 이벤트 루프 API를 노출하는 것을 고려해야한다고 생각합니다. 이것은 콜백 지옥을 간단히 해결할 것입니다. Node.js는 언어가 아닌 프레임 워크입니다.

var node = require("deasync");
node.loop = node.runLoopOnce;

var done = 0;
// async call here
db.query("select * from ticket", (error, results, fields)=>{
    done = 1;
});

while (!done)
    node.loop();

// Now, here you go

참고 URL : https://stackoverflow.com/questions/13448374/how-to-sleep-the-thread-in-node-js-without-affecting-other-threads

반응형