运行Scala线程

时间:2018-07-26 18:36:22

标签: 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)

因此,我尝试遍历列表,将list1,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)  
}

2 个答案:

答案 0 :(得分:3)

您可以将每个任务包装在Future中,应用map/recover处理成功/失败的期货,并使用Future.sequence将期货列表转换为{{1 }}。这是一个简单的示例:

Future of list

有关期货的更多详细信息,请参见相关的Scala doc

答案 1 :(得分:2)

假设def getReport(str: String): Future[HttpResponse]

Future.sequence(itemList.map( item => {
for {
  report1 <- getReport(q1.replace("xyz", item))
  report2 <- getReport(q2.replace("xyz", item))
  report3 <- getReport(q3.replace("xyz", item))
} yield {
  (report1, report2, report3)
}
})).onComplete {
   case Success(res) => // do something
   case Failure(err) => // handle error
}