javascript(缺少)并发[线程](非)问题

时间:2013-09-20 19:09:35

标签: javascript multithreading

这不是一个问题,而更像是一个突然的启蒙。

所以我有两个初始化函数,它们在javascript中连续符文:

object1.Init();
object2.Init();

所以我想,为了让它们“更快”,我可以尝试同时调用它们,以便它们可以通过这种方法同时运行:

setTimeout(function() {
    object1.Init();
}, 0);

setTimeout(function() {
    object2.Init();
}, 0);

我的理由是,如果我这样做,两个函数将“同时”启动,然后每个函数都花费时间结束(一个可以在300毫秒结束,另一个在500毫秒结束)。

哇这是我最初想的一个好主意,但后来我意识到两个 Init()函数都使用了一个全局变量,所以我吓死了,其中一个可以被另一个变更从而导致灾难性后果。

所以我最终做了这个简单的测试,看看我的假设是否正确。

var cnt = 0;
var x1 = 0;
var x2 = 0;

setTimeout(function() {
    t1 = new Date().getTime();
    for (cnt=0; cnt<1000000000; cnt++) {
        x1++;
    }
    t2 = new Date().getTime();
    document.getElementById("mydiv").innerHTML += "<br>" + (t2-t1) + " milliseconds " + x1 + "#" + t1 + "#" + t2;
}, 0);

setTimeout(function() {
    var t3 = new Date().getTime();
    for (cnt=0; cnt<1000000000; cnt++) {
        x2++;
    }
    var t4 = new Date().getTime();
    document.getElementById("mydiv").innerHTML += "<br>" + (t4-t3) + " milliseconds " + x2 + "#" + t3 + "#" + t4;
}, 0);

的结果是:

2504 milliseconds 1000000000#1379702812419#1379702814923
2514 milliseconds 1000000000#1379702814923#1379702817437

真正告诉我的是:

a)javascript中没有并发性,因为第二个循环在第一个循环结束后开始

b)因此我很安全,全局变量不会受到影响

c)使用settimeout()这样运行两个init()函数是没有意义的

我想a)是因为javascript是单线程的,这真是一个耻辱(是的,我知道网络工作者)。

2 个答案:

答案 0 :(得分:1)

  

a)javascript中没有并发性,因为第二个循环在第一个循环结束后开始

是的,就像你自己说的那样,JavaScript运行单线程,而且没有同步操作。

  

b)因此我很安全,全局变量不会受到影响

是的,你很安全。

  

c)使用settimeout()这样运行两个init()函数是没有意义的

...的确

答案 1 :(得分:0)

你在全球范围内谈论的是“javascript”,但是在浏览器的上下文中讨论它。

我建议您查看Async库。我在Node中使用它。它使用完全标准的处理器切片“同时”执行多个操作。它在技术上可能是一个单独的线程,但不是你(可能)习惯它的方式,每一行都阻塞,直到前一行执行时才发生任何事情。只要您有异步回调,就会有模拟多个并发线程的行为。

要试验这一点,请编写一个HTTP请求(或7)并观察他们的回调在各种非阻塞时间返回。或者尝试文件系统调用,SQL调用,或任何其他冒险与环境互动的东西。在每种情况下,你都会遇到“多线程”的表演行为。