function takesTime(){
for (var i = 0; i<some_very_large_number; i++){
//do something synchronous
}
console.log('a');
}
takesTime();
console.log('b');
这打印: 一个 b 你怎么打印: b 一个
答案 0 :(得分:20)
for (var i = 0; i < someVeryLargeNumber; ++i) {
setTimeout(function () {
//do something synchronous
}, 0);
}
另见setZeroTimeout每个循环获得几毫秒,尽管人们在那里做的工作似乎是基于浏览器的。
答案 1 :(得分:16)
我看到这是标记为node.js的,所以我将从这个角度回答:你不应该。通常,如果你阻塞,它将是:网络绑定(你应该在异步方法中使用和/或重用network libraries),I / O绑定(你应该使用和/或重用{{ 3}}),或CPU绑定。你没有为长期运行的任务提供任何上下文,并且假设你有一个包含some_very_large_number
的循环不变量,我假设你正在想象一些CPU密集型任务在一个大字段上迭代。
如果你真的受CPU限制,你应该重新考虑你的策略。节点只存在于一个核心上,所以即使你能够使用多线程,你也只是在转动轮子,因为每个请求仍然需要一定的CPU时间。如果你真的打算做一些计算密集型的事情,你可能需要考虑使用I/O libraries,并让其他东西处理那些更适合用于处理它的数据。
答案 2 :(得分:4)
Javascript是基于事件的,一切都在一个线程中发生。使它“异步”的方法是使用超时(setTimeout())。
答案 3 :(得分:1)
您可以使用Web worker来实现您的目标,但是您需要一个单独的js文件,并且您必须添加管道代码来发布消息并处理这些消息。
node.js本身不支持Web工作者,但可以在以下位置获得实现:
https://github.com/cramforce/node-worker/
否则,它类似于以下代码:
var pid = require('child_process').spawn('node', ['childScript.js']) pid.stdout.on('data', function(data) { console.log(data); }); console.log('b');
for (var i = 0; i < some_very_large_number; i++) { // do something synchronous } console.log('a');