Scala программа с использованием фьючерсов не прекращается - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь изучить параллелизм в Scala и использую фьючерсы Scala для генерации набора данных со случайной строкой. Я хочу создать приложение, которое должно генерировать файл с любым количеством записей, и оно должно быть масштабируемым.

Код:

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
Когда я запускаю программу, используя Jar как:

scala -cp target/scala-2.13/datagenerator_2.13-0.1.jar com.generator.DataGenerator "pqr.csv" "1000" Она ждет бесконечное время и не записывает в файл.

Любая помощь очень ценится :)

1 Ответ

0 голосов
/ 31 января 2020

Попробуйте эту версию

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 ваша программа может выйти до того, как будущее закончится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...