Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 运行Scala线程_Multithreading_Scala_Http - Fatal编程技术网

Multithreading 运行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

我是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)
因此,我尝试在列表中循环,用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{}传递了错误的字符串-非常感谢