当前位置: 首页 > 知识库问答 >
问题:

如何让线程在node.jsHibernate而不影响其他线程?

谭梓
2023-03-14

根据了解node.js事件循环,node.js支持单线程模型。这意味着如果我向node.js服务器发出多个请求,它不会为每个请求生成一个新线程,而是一个接一个地执行每个请求。这意味着如果我在node.js代码中对第一个请求执行以下操作,同时节点上出现一个新请求,第二个请求必须等到第一个请求完成,包括5秒的睡眠时间。对吗?

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

有没有一种方法可以让node.js为每个请求生成一个新线程,这样第二个请求就不必等待第一个请求完成,或者我可以只在特定线程上调用睡眠?

共有3个答案

艾心远
2023-03-14

请考虑deasync模块,我个人不喜欢Promise方式使所有函数异步,关键字async/await anywhere。我认为官方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
叶经略
2023-03-14

如果您有一个循环,每个循环中都有一个异步请求,并且您希望每个请求之间有一段特定的时间,那么可以使用以下代码:

   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 秒,然后再发送下一个请求。

通正平
2023-03-14

如果您指的是 npm 模块Hibernate,它在自述文件中指出Hibernate将阻止执行。所以你是对的 - 这不是你想要的。相反,您希望使用非阻塞的设置超时。下面是一个示例:

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

对于任何希望使用 es7 异步/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();
 类似资料:
  • 你好,我是多线程编程的新手。我正在尝试创建一个代码来创建一个线程THREAD1,在它完成某些事情后,它会触发另外两个线程,例如THREAD2和THREAD3,然后退出。 我写了两个可能的解决方案。 1) 使用条件变量(不起作用:在某些情况下会出现死锁): 2) THREAD1直接创建另外两个线程。 我想知道你的意见。非常感谢你

  • 我知道线程是并发运行的,所以您无法预测执行的顺序,但在提供的代码中,我在运行其他代码之前加入了thread。如果应该等到线程执行完毕,那么为什么顺序仍然是随机的呢?在两个print语句之前加入任何内容总是会导致它们最后被打印,而如果我在之后加入所有内容,它并不总是最后,为什么?

  • 在下面的代码中,我们使用runOnUiThread的方式不应该对现有的UI线程产生问题,从而对应用程序产生问题,因此不应该使用

  • 多线程其他模式 Promise Pipeline Master-Slave Serial Thread Confinement Promise 所谓Promise, 就是一个对象, 用来传递异步操作的消息. 它代表了某个未来才会知道结果的事件(通常是一个异步操作), 并且这个事件提供统一的API, 可供进一步处理. 对象的状态不受外界影响. Promise对象代表一个异步操作, 有三种状态: Pe

  • 我是线程新手,但我有一个EditText视图,每当它失去焦点时,它就会使用用户从EditText输入的图像徽标填充回收视图。但是,每当用户失去焦点并调用该方法时,一切都会停止一段时间(这意味着我不擅长线程)。如何改进此代码,使其能够顺利运行? 我的活动类: 我的googleRequest类: