【问题标题】:Managing a Queue with Multiple, Asynchronous Calls管理具有多个异步调用的队列
【发布时间】:2013-08-21 16:24:16
【问题描述】:

我正在用 JavaScript 编写一个队列,该队列将由多个“服务器”异步处理。我担心两台服务器可能会从队列中检索相同的项目。它现在似乎没有发生,但我不想让它碰运气。据我所知,JavaScript 是单线程的;这是否允许假设即使同时有多个请求,JavaScript 也会使用它自己的队列来执行函数?

function getJob() {
  if(jobs.length > 0) {
      var job = jobs.shift();
      $('#jobStatsQueueCount').text(jobs.length);
      return job;
  } else {
      return null;
  }
}

这里是完整的代码:

http://jsfiddle.net/L7yaB/5/

【问题讨论】:

    标签: javascript asynchronous queue


    【解决方案1】:

    JavaScript 是单线程的;这是否允许假设即使同时会有多个请求

    “同时”在计算机领域是不存在的。总有一些秩序。

    如果您单击两次,您将获得两个 onclick 事件,一个接一个。即使您单击时您的浏览器很忙,它们仍然会一个接一个地发生,并且以您触发它们的相同顺序发生。这是您可以假设的:事件永远不会相互竞争、超越或交错。

    由于没有事件交错,即使shift 不是原子的(它可能不是,但它也不会像您建议的那样冒着常见线程错误的风险)没关系)。

    【讨论】:

    • 没错,但是这种情况呢:有一份工作;服务器 1 确定有一个作业;服务器 2 确定有一个作业,服务器 1 检索作业,然后服务器 2,已经通过检查,失败,因为作业已经消失。
    • ...或者,您是说在服务器 1 执行完成之前,服务器 2 的 getJob 执行不会发生?
    • ...或者,当您查看我的完整代码时,任何服务器的间隔事件都不会执行,直到 JavaScript 完成任何已经执行的间隔事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多