multithreading - 运行 Scala 线程

标签 multithreading scala http

我是 Scala 的绝对初学者,但有这个问题需要解决。 所以我有一个参数列表

itemList = List('abc', 'def', 'ghi','jkl','mno', 'pqr')

我有这 3 个参数查询

 val q1 = "env='dev1'&id='123'&listitem='xyz'"
 val q2 = "env='dev2'&id='1234'&listitem='xyz'"
 val q3 = "env='dev3'&id='12345'&listitem='xyz'"

 val report1 = getReport(q1)
 val report2 = getReport(q2)
 val report3 = getReport(q3)

因此,我尝试循环遍历列表,将 q1、q2 和 q3 中的 listitem 参数替换为 listitem,然后为列表中的每个项目运行 http 请求报告。

由于每个 getReport 请求都是异步的,因此我需要等待,因此我无法转到列表中的下一项,就像我要执行循环一样。

所以我想为列表中的每个项目启动 3 个线程,然后将 3 个报告合并为 1 个最终报告,或者我可以按顺序执行。

我如何为列表中的每个项目使用 3 个线程来完成此操作? 这是我的想法:

val reportToken = [ q1, q2,q3 ]
val listTasks = [ getReport(q1) , getReport(q2) , getReport(q3) ]

for (i <- 1 to 3) {
    val thread = new Thread {
        override def run {
            listTasks (reportToken(i))
        }
   val concat += listTask(i) 
    }
    thread.start
    Thread.sleep(50)  
}

最佳答案

您可以将每个任务包装在 Future 中,应用 map/recover 来处理成功/失败的 Future,并使用 Future.sequence code> 将 Future 列表转换为 Future of 列表。这是一个简单的例子:

import scala.concurrent.{Future, Await}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration

def getReport(q: String) = q match {
  case "q2" => throw new Exception()
  case q => s"got $q"
}

val reportToken = Seq("q1", "q2", "q3")
val listTasks = reportToken.map( q => Future{ getReport(q) } )
// listTasks: Seq[scala.concurrent.Future[String]] = ...

val f = Future.sequence(
  listTasks.map(_.map(Some(_)).recover{case _ => None})
)
// f: scala.concurrent.Future[Seq[Option[String]]] = ...

Await.result(f, Duration.Inf)
// res1: Seq[Option[String]] = List(Some(got q1), None, Some(got q3))

有关 future 的更多详细信息,请参阅相关的 Scala doc .

关于multithreading - 运行 Scala 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51545517/

相关文章:

scala - 案例分类和特征

html - http响应中的空格和空行是否会影响下载页面的速度?

http - 如何使用 curl 以 UTF-8 编码发布表单数据?

python - BeautifulSoup 登录 - 如何获取具有特定属性和值的 crsf 字段

multithreading - Delphi如何使用线程

Python请求,警告: urllib3.连接池:连接池已满

scala - Scala 集合的内存管理如何工作?

Scala 将 Json 文件读取为 Json

java - 用 Java 编写线程安全的模块化计数器

c++ - 带有 Vector 迭代器的多线程