代码之家  ›  专栏  ›  技术社区  ›  Daniel

javascript-事件驱动和并发问题?

  •  8
  • Daniel  · 技术社区  · 15 年前

    问候语,

    我一直在学习javascript,nodejs。我不理解如何在JavaScript中避免并发性问题。

    假设我在处理一个物体

    var bigObject = new BigObject();
    

    我有一个 setTimer(function(){ workOnBigOjbect...} ) 那也能解决 bigOjbect .

    如果我有磁盘IO正在写入 bigObject 和正在处理的计时器对象 大对象 ,并定期从 大对象 ,如何避免并发问题?

    在常规语言中,我将使用互斥或线程安全队列/命令模式。我也没有看到太多关于JavaScript竞争条件的讨论。

    我错过什么了吗?

    4 回复  |  直到 11 年前
        1
  •  9
  •   Amnon    15 年前

    node.js的关键在于它是事件驱动的。所有代码都在单个线程的事件处理程序中运行。没有并发性问题,因为代码没有并发运行。缺点是每个事件处理程序必须快速退出,因为它会阻塞其他事件。

    在您的示例中,代码将启动磁盘IO并立即退出。node.js基础结构将通过运行事件处理程序通知程序IO操作已完成。计时器事件将在IO事件之前或之后调用,但不能同时调用。

        2
  •  3
  •   Jacob Mattison    15 年前

    javascript是单线程的。如果您的函数应该执行(基于您调用settimer的方式),并且父代码仍在运行,那么在父代码完成之前,该函数将不会执行。

        3
  •  2
  •   Community Mohan Dere    9 年前

    只有一个线程;请参见: Node.js on multi-core machines

    我推测这是因为底层V8 JavaScript引擎不支持多个线程,因为通常情况下,JavaScript在浏览器中执行(在Windows中,只有一个UI线程),并且不支持多个线程。

        4
  •  1
  •   Uzair Farooq    11 年前

    在javascript中有一个叫做 Run-to-Completion 这可以确保如果代码正在执行,它会在任何其他(异步)代码运行之前完全执行,因此不会出现并发问题。

    对于您的示例,每当调用计时器回调时,它将完全执行,并且不会在中间预先清空以执行其他代码。

    见 Why no concurrency control tool in javascript 了解更多详细信息。