根据了解node.js事件循环,node.js支持单线程模型。这意味着如果我向node.js服务器发出多个请求,它不会为每个请求生成一个新线程,而是一个接一个地执行每个请求。这意味着如果我在node.js代码中对第一个请求执行以下操作,同时节点上出现一个新请求,第二个请求必须等到第一个请求完成,包括5秒的睡眠时间。对吗?
var sleep = require('sleep');
sleep.sleep(5)//sleep for 5 seconds
有没有一种方法可以让node.js为每个请求生成一个新线程,这样第二个请求就不必等待第一个请求完成,或者我可以只在特定线程上调用睡眠?
请考虑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
如果您有一个循环,每个循环中都有一个异步请求,并且您希望每个请求之间有一段特定的时间,那么可以使用以下代码:
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 秒,然后再发送下一个请求。
如果您指的是 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类: