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