请考虑一个Scala.js类,其中包含一个名为xArr的大型JavaScript typed array。
名为 p(xArr)的进程使用xArr作为输入,但需要很长时间才能完成。为了避免脚本超时警告, p(xArr)在Web Worker中运行。
记忆一下主线程和Web Worker线程之间的通信限制:
由于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/