请考虑一个Scala.js类,其中包含一个名为xArr的大型JavaScript typed array

名为 p(xArr)的进程使用xArr作为输入,但需要很长时间才能完成。为了避免脚本超时警告, p(xArr)在Web Worker中运行。

记忆一下主线程和Web Worker线程之间的通信限制:

  • 双向通信都采用message passing的形式。
  • 消息数据必须符合JavaScript的structured clone algorithm的要求。
  • 除非在可选的传输列表中指定,否则消息数据将被复制,而不是往返于主线程和工作线程。
  • 要传输消息数据而不是将消息数据复制到工作线程或从工作线程复制消息,该数据必须实现Transferable接口(interface),并且传输列表必须包含对可传输数据的引用。
  • 如果可转移对象在线程之间转移,则发送线程将无法访问它。

  • 由于xArr的大小,将其副本发送到工作线程会导致严重的内存开销,但是由于 p(xArr)的运行时间,它无法在主线程中运行。

    幸运的是,类型化的数组实现了Transferable接口(interface),因此,为了节省计算和内存资源,该程序通过将xArr传输到WebWorker来调用 p(xArr),该WebWorker会调用 p(xArr),然后将xArr传输回主线程。

    不幸的是,主线程中的其他异步方法必须访问xArr,而xArr在调用时可能已经转移到工作程序的作用域中。

    Scala语言的哪些功能可以控制对xArr的访问,以便在主线程拥有xArr时立即执行方法调用,而在工作人员拥有xArr时等待方法返回作用域?

    换句话说:您将如何处理随时间在定义和未定义之间连续交替的类变量?

    你会建议锁吗? promise /回调队列?您会以完全不同的方式解决问题吗?如果是这样,怎么办?

    请记住,这是一个Scala.js库,因此我们必须取消JVM特定功能的资格。

    最佳答案

    我了解您在这里的真正痛苦。该功能过去曾与SharedArrayBuffer一起使用,但目前已在Chrome中禁用。遗憾的是,共享内存没有其他选择:



    有计划在适当的安全审核完成后重新添加SharedArrayBuffer。我想我们必须等待。

    如果您在Node中运行代码-这将很困难,但有可能。

    关于javascript - WebWorkers和异步共享数据访问。在Scala.js中如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49951842/

    10-13 09:40