【问题标题】:javascript - event driven and concurrency issues?javascript - 事件驱动和并发问题?
【发布时间】:2011-05-11 16:23:37
【问题描述】:

您好,

我一直在研究 javascript,nodejs。而且我不明白如何在 javascript 中避免并发问题。

假设我正在处理一个对象

var bigObject = new BigObject();

我有一个setTimer(function(){ workOnBigOjbect...} ),它也可以在bigOjbect 上工作。

如果我将磁盘 IO 写入bigObject,并且有一个计时器对象在bigObject 上工作,并定期从bigObject 读取代码,如何避免并发问题?

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

我错过了什么吗?

【问题讨论】:

    标签: javascript concurrency node.js race-condition


    【解决方案1】:

    Javascript 是单线程的。如果到了函数应该执行的时间(基于您调用 setTimer 的方式),并且父代码仍在运行,则该函数将在父代码完成之前不会执行。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这实际上是一个设计决策:进程是 node.js 的基本单元。无论如何,JavaScript 是一种事件语言,所以线程真的没有意义。
      【解决方案3】:

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

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

      【讨论】:

      • scrrraatchhhhh 齿轮在我脑海中移动的声音!我明白了,但我需要再调解一下。
      • 最好的理解方法就是使用它——用node.js写几个小程序。
      • @Daniel,你是说冥想吗? :) 另外,我想我只是在脑海中听到了同样的声音。多少次 - 在我的大脑崩溃之前在语言和平台之间来回切换?
      【解决方案4】:

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

      在您的示例中,每当调用计时器回调时,它将完全执行,并且永远不会在中间被抢占执行其他代码。

      更多详情请见Why no concurrency control tool in javascript

      【讨论】:

        猜你喜欢
        • 2010-12-20
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        相关资源
        最近更新 更多