我绝对是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)
}
答案 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
}