小编Ben*_*eby的帖子

WebWorkers和异步共享数据访问.如何在Scala.js?

请考虑一个Scala.js类,它包含一个名为xArr的大型JavaScript 类型数组.

这个过程被称为 P(xArr)消耗xArr作为输入,但需要很长的时间才能完成.为了避免脚本超时警告,p(xArr)在Web Worker中运行.

回想一下主线程和Web Worker线程之间通信的这些限制:

  1. 任何一个方向的通信都采用消息传递的形式.
  2. 消息数据必须符合JavaScript的结构化克隆算法的要求.
  3. 除非在可选传输列表中指定,否则消息数据将被复制,而不是传输到主线程和工作线程.
  4. 要传输消息数据而不是将其复制到工作线程或从工作线程复制,数据必须实现Transferable接口,并且传输列表必须包含对可传输数据的引用.
  5. 如果可转移对象在线程之间传输,则发送线程将失去对它的访问权.

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

幸运的是,类型数组实现转换接口,因此,以节省计算和存储器资源,所述程序调用P(xArr)通过转移xArr到调用WebWorker P(xArr)然后传送xArr回主线程.

不幸的是,主线程中的其他异步方法必须访问xArr,它可能在调用时传输到工作者的作用域.

什么Scala语言功能可以控制对xArr的访问,以便方法调用在主线程拥有xArr时立即执行,但等待它在工作者拥有xArr时返回范围?

换句话说:你如何处理一个连续在定义未定义之间交替的类变量?

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

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

javascript asynchronous scala web-worker scala.js

8
推荐指数
1
解决办法
520
查看次数

使用 Scala 3 宏重写方法

我正在尝试使用 Scala 3 宏和 TASTY 重写方法。我想重写任何类型的任何方法。现在我从这个简单的案例开始。

我有一个测试基类:

class TestClass {
  def func(s: String) = "base"
}
Run Code Online (Sandbox Code Playgroud)

我想实现这一点,但是通过使用 TASTY,我发现不可能调用new A带有引号和拼接的泛型类型:

'{
    new TestClass() {
       override def func(s: String) = "override"
    }
}.asExprOf[A]
Run Code Online (Sandbox Code Playgroud)

我打印了上述代码的 AST,并且几乎成功地重新创建了它。问题是我无法调用new生成的类 - 我没有找到访问新类的符号或类型的方法。我也尝试Symbol.requiredClass()使用新名称,尽管它返回了一些符号,但在宏扩展期间出现错误,未找到该类。

我的问题是:

  • 是否可以在不显式调用:的new Class {}情况下派生自定义类型?
  • 是否ClassDef.copy注册一个可以帮助创建新实例的新名称?
  • 可以手动调用ClassDef创建类的实例吗?
  • Symbol.requiredClass即使之前没有定义,如何使用返回的符号,因为它会返回某些内容?

我创建的代码:

import scala.quoted.*

object NewClass {

  def newClassImpl[A: Type](e: Expr[A])(using Quotes): Expr[A] = {
    import quotes.reflect.*

    val typeRep = TypeRepr.of[A]

    val ret = typeRep.classSymbol.map(_.tree) match …
Run Code Online (Sandbox Code Playgroud)

scala scala-macros scala-3

5
推荐指数
1
解决办法
876
查看次数