Scala 中的未来和无限循环
Future and infinite loop in Scala
我想在 scala 中执行 2 个独立的无限循环。每个 运行 第一个任务大约需要 1 秒,第二个任务需要 0.5 秒。
代码如下:
package future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
object MyFuture {
def task1(): Future[Unit] = Future {
println("doing job 1")
Thread.sleep(1000)
}
def task2(): Future[Unit] = Future {
println("doing job 2")
Thread.sleep(500)
}
def infiniteLoop(): Future[Unit] = {
Future.sequence(List(task1(), task2())).flatMap(x => infiniteLoop())
}
def main(args: Array[String]): Unit = {
Await.ready(infiniteLoop(), Duration.Inf)
}
}
程序的输出
doing job 1
doing job 2
doing job 2
doing job 1
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
我希望作业 2 的输出是作业 1 的两倍,因为它需要一半的时间。
我可以做什么来模拟 2 个真正的独立进程?
考虑使用 java 的 scheduled executor 以固定间隔安排任务。或者,如果您需要在这些任务之间进行通信,则可以使用 Akka。
顺便说一句,这段代码可以满足您的要求:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
/**
* Created by hibou on 13/02/16.
*/
object MyFuture {
def task1(): Future[Unit] = Future {
println("doing job 1")
Thread.sleep(1000)
}
def task2(): Future[Unit] = Future {
println("doing job 2")
Thread.sleep(500)
}
def loopTask1(): Future[Unit] = {
task1.flatMap(_ => loopTask1())
}
def loopTask2(): Future[Unit] = {
task2.flatMap(_ => loopTask2())
}
def infiniteLoop(): Future[Unit] = {
Future.sequence(List(loopTask1(), loopTask2())).map(_ => ())
}
def main(args: Array[String]): Unit = {
Await.ready(infiniteLoop(), Duration.Inf)
}
}
我想在 scala 中执行 2 个独立的无限循环。每个 运行 第一个任务大约需要 1 秒,第二个任务需要 0.5 秒。
代码如下:
package future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
object MyFuture {
def task1(): Future[Unit] = Future {
println("doing job 1")
Thread.sleep(1000)
}
def task2(): Future[Unit] = Future {
println("doing job 2")
Thread.sleep(500)
}
def infiniteLoop(): Future[Unit] = {
Future.sequence(List(task1(), task2())).flatMap(x => infiniteLoop())
}
def main(args: Array[String]): Unit = {
Await.ready(infiniteLoop(), Duration.Inf)
}
}
程序的输出
doing job 1
doing job 2
doing job 2
doing job 1
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
我希望作业 2 的输出是作业 1 的两倍,因为它需要一半的时间。
我可以做什么来模拟 2 个真正的独立进程?
考虑使用 java 的 scheduled executor 以固定间隔安排任务。或者,如果您需要在这些任务之间进行通信,则可以使用 Akka。 顺便说一句,这段代码可以满足您的要求:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
/**
* Created by hibou on 13/02/16.
*/
object MyFuture {
def task1(): Future[Unit] = Future {
println("doing job 1")
Thread.sleep(1000)
}
def task2(): Future[Unit] = Future {
println("doing job 2")
Thread.sleep(500)
}
def loopTask1(): Future[Unit] = {
task1.flatMap(_ => loopTask1())
}
def loopTask2(): Future[Unit] = {
task2.flatMap(_ => loopTask2())
}
def infiniteLoop(): Future[Unit] = {
Future.sequence(List(loopTask1(), loopTask2())).map(_ => ())
}
def main(args: Array[String]): Unit = {
Await.ready(infiniteLoop(), Duration.Inf)
}
}