Multithreading 运行Scala线程
我是Scala的绝对初学者,但有这个问题需要解决。 所以我有一个参数列表Multithreading 运行Scala线程,multithreading,scala,http,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='1234
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)
因此,我尝试在列表中循环,用listitem替换q1、q2和q3中的listitem参数,然后为列表中的每个项目运行http请求报告
由于每个getReport请求都是异步的,所以我需要等待,因此无法转到列表中的下一项,就像我执行循环一样
所以我想为列表中的每个项目启动3个线程,然后将3个报告合并成最后一个,或者我可以按顺序执行
对于列表中的每个项目,我将如何使用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)
}
val reportToken=[q1、q2、q3]
val listTasks=[getReport(第一季度)、getReport(第二季度)、getReport(第三季度)]
对于(i假设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
}
Future.sequence(itemList.map)(item=>{
为了{
report1假设def getReport(str:String):未来[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
}
Future.sequence(itemList.map)(item=>{
为了{
report1您可以将每个任务包装在未来
中,应用映射/恢复
处理成功/失败的未来,并使用未来.sequence
将未来列表转换为未来列表
。下面是一个简单的示例:
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))
有关未来的更多详细信息,请参阅相关的。您可以将每个任务包装在未来
中,应用映射/恢复
处理成功/失败的未来,并使用未来.sequence
将未来列表转换为未来列表
。以下是一个简单的示例:
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
比使用Thread
要容易得多。好的,我同意,你将如何使用Future?:-)试试看,让我们知道你的困境在哪里?好的,是听起来不错Future.sequence(liststasks.map(Future.apply))
使用Future
比使用Thread
容易得多。好的,我同意,你将如何使用Future?:-)试试看,让我们知道你遇到了什么困难?好的,听起来不错Future.sequence(listTasks.map(Future.apply))
谢谢!不过它什么也不返回,程序只是stops@uniXVanXcel,我在Scala shell上运行它以验证概念。要从Future和Option打开结果列表,可以应用onSuccess
,例如:Future.sequence(…).onSuccess{case list=>println(list.flatte)}
哦,我明白了,也许这就是为什么-我创建了一个对象,我想我需要在末尾添加一个sleep函数,以便它继续运行?我建议使用wait.result()
。请查看我的扩展答案。让它工作吧!,将参数中的错误字符串传递给Future{}-多谢了,汉克斯!不过它什么也不返回,程序只是stops@uniXVanXcel,我在Scala shell上运行它以验证概念。要从Future和Option打开结果列表,可以应用onSuccess
,例如:Future.sequence(…).onSuccess{case list=>println(list.flatte)}
哦,我明白了,也许这就是为什么-我创建了一个对象,我想我需要在末尾添加一个sleep函数,以便它继续运行?我建议使用wait.result()
。请查看我的扩展答案。让它工作吧!我的参数中向Future{}传递了错误的字符串-非常感谢