将monix.eval.Task转换为scala.concurrent.Future

jxct1oxe  于 8个月前  发布在  Scala
关注(0)|答案(1)|浏览(88)

我正在尝试重用一些使用monix.eval.Task的模块来执行JavaScript任务。我的项目使用scala.concurrent.Future
我试图了解最好的方法来转换它到Future与最少的损害。
最简单的方法是使用一个额外的线程池:

import monix.eval.Task
import monix.execution.Scheduler.Implicits.global

import scala.concurrent.Future

// Create a Monix Task
val monixTask: Task[String] = Task("Hello, Monix!")

// Convert the Task to a Future using toFuture
val scalaFuture: Future[String] = monixTask.toFuture

但我不完全理解性能的含义。
1.我已经在项目中定义了scala.concurrent.ExecutionContext。添加全局monix.execution.Scheduler有什么含义?
1.在哪里实际计算任务?使用ExecutionContext还是Scheduler?我猜它在Scheduler上排队,有一个小的转换开销,然后在ExecutionContext上运行?
给定的模块只是在他收到的所有Future上使用Task.deferFuture
异步任务是IO任务,具有300 k ~ 600 k rpm。

vxf3dgd4

vxf3dgd41#

Monix的默认Scheduler委托给Scala的默认ExecutionContext,所以如果你试图避免使用那个EC,你应该定义你自己的Scheduler示例来使用你的自定义EC。这个工具包有几个为此目的定义的apply方法。
ScheduledExecutorService用于 * 调度 * 任务,ExecutionContext用于 * 运行 * 任务。因此,如果您将自定义ExecutionContext传递给Scheduler.apply,则任务将在那里运行。
关于TaskFuture之间的互操作的说明:Task是懒惰的。构建一个并不运行它。因此,当将返回Future的表达式 Package 为Task时,deferFuture以按名称调用的方式接受该表达式,因此Future实际上不会被构造和启动,直到该Task被告知运行。
由于您提到了任务包含IO(我假设您的意思是“I/O”意义上的IO,而不是cats.effect.IO),因此可能需要设置一个单独的专用线程池(ExecutionContext)来执行IO绑定操作,这样它们就不会阻塞CPU绑定的“计算”线程。Scheduler.io是一个起点。

相关问题