Javascript Web工作者并发异常

Javascript Web工作者并发异常,javascript,concurrency,web-worker,Javascript,Concurrency,Web Worker,我已经开始在我的一些应用程序中使用web workers,正如大家所知,99%的时候,当你尝试使用新的东西时,你使用它是错误的。因此,我很自然地查阅了它,发现了一段关于线程安全的有趣文章: Worker接口产生真正的OS级线程,并发性可以 如果不小心,会在代码中产生有趣的效果。然而 对于网络工作者来说,他们需要小心地控制交流 点与其他线程意味着它实际上很难引起 并发问题。无法访问非线程安全组件 或者DOM,您必须将特定数据传入和传出线程 通过序列化对象。所以你必须非常努力地工作 代码中的问题 是

我已经开始在我的一些应用程序中使用web workers,正如大家所知,99%的时候,当你尝试使用新的东西时,你使用它是错误的。因此,我很自然地查阅了它,发现了一段关于线程安全的有趣文章:

Worker接口产生真正的OS级线程,并发性可以 如果不小心,会在代码中产生有趣的效果。然而 对于网络工作者来说,他们需要小心地控制交流 点与其他线程意味着它实际上很难引起 并发问题。无法访问非线程安全组件 或者DOM,您必须将特定数据传入和传出线程 通过序列化对象。所以你必须非常努力地工作 代码中的问题

是否有人能够使用web workers导致并发问题?到目前为止,我试图在Firefox和Chrome中破坏web worker实现的尝试已经失败

因此,您必须非常努力地工作,以便在代码中产生问题

我认为这里所指的问题并不是其他多线程环境中并发性可能带来的问题,通常源于非原子操作的可能性,因此需要使用一些技术来控制对代码块的访问,以确保内存不会进入损坏状态。由于API中没有阻塞“等待,直到我收到某个东西”调用,我还怀疑这并不意味着这些类型的调用可能会带来问题,即死锁的形式,其中每个线程同步阻塞,直到它收到另一个线程的调用

但是,您仍然可能陷入“逻辑”死锁状态。虽然您不能真正“阻止”每个工作线程,但您可以编写一些代码,使每个工作线程(/main UI线程)永远无法进入其有用的工作(不管是什么)。例如,如果每个工人都遵循如下算法:

  • 接收来自其他用户的消息
  • 向其他用户发送消息
  • 有用的工作
  • 然后他们就再也无法进入第二步,更不用说第三步了,因为每个人都会在发送消息之前等待接收消息。在Javascript中,代码看起来有点像:

    self.onmessage = function(e) {
      self.postMessage(...);
      usefulWork();
    };
    
    我怀疑文档编写者的意思是,要以这种方式编写算法,而不是以一种不会死锁的方式编写算法,你必须“非常努力地工作”

    诚然,如果这就是文档的意思,那就不是很清楚了