使用期货的scala程序不终止

问题描述 投票:0回答:1

我正在尝试在Scala中学习并发性,并使用Scala Futures生成具有随机字符串的数据集。我想创建一个应用程序,该应用程序应生成具有任意数量记录的文件,并且该文件应具有可伸缩性。

代码:

import java.util.concurrent.{ExecutorService, Executors}
import scala.util.{Failure, Random, Success}
import scala.concurrent.duration._

  object datacreator {

    implicit val ec: ExecutionContext = new ExecutionContext {

    val threadPool: ExecutorService = Executors.newFixedThreadPool(4)

    def execute(runnable: Runnable) {
      threadPool.submit(runnable)
    }

    def reportFailure(t: Throwable) {}
  }

  def getRecord : String = {
    "Random string"
  }

  def main(args: Array[String]): Unit = {

    val filename = args(0)
    val number_of_records = args(1)
    val file_Object = new FileWriter(filename, true)

    val data: Future[Iterable[String]] = Future {
      for (i <- 1 to number_of_records.toInt)
        yield getRecord
    }

    val result = data.map{
      result => result.foreach(record => file_Object.write(record))
    }

    result.onComplete{
          case Success(value) => {
            println("Success")
            file_Object.close()
          }
          case Failure(e) => e.printStackTrace()
    }
  }
}

我面临以下问题:

  1. [当我使用SBT运行程序时,它正在将结果写入文件,但不会以无限模式终止。
[info] Loading project definition from /Users/cw0155/PersonalProjects/datagen/project
[info] Loading settings for project datagen from build.sbt ...
[info] Set current project to datagenerator (in build file:/Users/cw0155/PersonalProjects/datagen/)
[info] running com.generator.DataGenerator xyz.csv 100
Success
  | => datagen / Compile / runMain 255s
  1. 当我使用Jar作为运行程序时:

scala -cp target/scala-2.13/datagenerator_2.13-0.1.jar com.generator.DataGenerator "pqr.csv" "1000"它正在等待无限时间,并且未写入文件。

非常感谢您的帮助:)

scala concurrency
1个回答
0
投票

尝试此版本

bar.scala

import scala.concurrent.{Await, Future, ExecutionContext}
import scala.concurrent.duration._
import scala.util.{Success, Failure}
import ExecutionContext.Implicits.global
import java.io.FileWriter
object bar {
  def getRecord: String = "Random string\n"
  def main(args: Array[String]): Unit = {
    val filename = args(0)
    val number_of_records = args(1)
    val data: Future[Iterable[String]] = Future {
      for (i <- 1 to number_of_records.toInt)
        yield getRecord
    }
    val file_Object = new FileWriter(filename, true)
    val result      = data.map( r => r.foreach(record => file_Object.write(record)) )
    result.onComplete {
      case Success(value) =>
        println("Success")
        file_Object.close()
      case Failure(e) =>
        e.printStackTrace()
    }
    Await.result( result, 10.second )
  }
}

您的原始版本在像这样运行时给了我预期的输出

bash-3.2$ scala bar.scala /dev/fd/1 10
Success
Random string
Random string
Random string
Random string
Random string
Random string
Random string
Random string
Random string
Random string

但是如果没有Await.result,您的程序可以在将来完成之前退出。

© www.soinside.com 2019 - 2024. All rights reserved.