Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Scala 齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥_Scala_Zio - Fatal编程技术网

Scala 齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥

Scala 齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥,scala,zio,Scala,Zio,我有一个下一个任务,有N个db查询(例如3-Seq(10,20,30))和iterationCount=4。 我希望使用ZIO和next:顺序执行迭代,并在迭代内部并行评估效果 简化代码如下所示 import zio._ import zio.console._ case class Res(iterNum :Int, dataValue :Int) val execUnpure :(Int,Int) => Res = (iterNum,dataValue) => Res(it

我有一个下一个任务,有N个db查询(例如3-Seq(10,20,30))和iterationCount=4。 我希望使用ZIO和next:顺序执行迭代,并在迭代内部并行评估效果

简化代码如下所示

import zio._
import zio.console._

case class Res(iterNum :Int, dataValue :Int)

val execUnpure :(Int,Int) => Res = (iterNum,dataValue) =>
 Res(iterNum, dataValue)

val exec :(Int,Int) => Task[Res] = (iterNum,dataValue) =>
  Task.succeed(Res(iterNum, dataValue))

val evalEffectsParallel: (Int, Seq[Int]) => Task[Seq[Res]] =
  (iterNum, sqLoadConf) =>
    ZIO.collectAllPar(
      sqLoadConf.map(lc => 
        for {
          //here I open NEW db session for this exec.
          tr: Res <- exec(iterNum, lc)
        } yield tr

      )
    )

val seqParallelExec: (Int, Seq[Int]) => Task[Seq[Res]] =
  (iterNum, sqLoadConf) =>
    for {
      sqTestResults: List[Seq[Res]] <-
      IO.collectAll(
        (1 to iterNum).map(thisIter => evalEffectsParallel(thisIter, sqLoadConf))
      )
      r <- Task(sqTestResults.flatten)
    } yield r

val program : Int => Task[Seq[Res]] = iterationCount => 
      for {
            res <- seqParallelExec(iterationCount, Seq(10,20,30))
          } yield res

(new zio.DefaultRuntime {}).unsafeRun(
  for {
    sp <- program(4)
    _  <- putStrLn(s"seqpar = ${sp.toString}")
  } yield ()
)
以及3次迭代的结果

 iter : [1] test : [1] pid=[13505] startTs [1575955678690] endTs [1575955678756] 
 iter : [1] test : [4] pid=[13510] startTs [1575955678691] endTs [1575955678883] 
 iter : [1] test : [6] pid=[13508] startTs [1575955678697] endTs [1575955678965] 
 iter : [1] test : [5] pid=[13507] startTs [1575955678697] endTs [1575955679106] 
 iter : [1] test : [2] pid=[13506] startTs [1575955678693] endTs [1575955679208] 
 iter : [1] test : [3] pid=[13509] startTs [1575955678697] endTs [1575955680438] 

iter : [2] test : [1] pid=[13514] startTs [1575955680653] endTs [1575955681291] 
 iter : [2] test : [4] pid=[13517] startTs [1575955681071] endTs [1575955681367] 
 iter : [2] test : [5] pid=[13518] startTs [1575955681071] endTs [1575955681396] 
 iter : [2] test : [6] pid=[13519] startTs [1575955681276] endTs [1575955681484] 
 iter : [2] test : [2] pid=[13515] startTs [1575955681071] endTs [1575955681645] 
 iter : [2] test : [3] pid=[13516] startTs [1575955681106] endTs [1575955682712] 

iter : [3] test : [1] pid=[13521] startTs [1575955682830] endTs [1575955682903] 
 iter : [3] test : [4] pid=[13524] startTs [1575955682819] endTs [1575955682938] 
 iter : [3] test : [6] pid=[13526] startTs [1575955682832] endTs [1575955683137] 
 iter : [3] test : [5] pid=[13525] startTs [1575955682863] endTs [1575955683428] 
 iter : [3] test : [2] pid=[13522] startTs [1575955682816] endTs [1575955683476] 
 iter : [3] test : [3] pid=[13523] startTs [1575955682902] endTs [1575955684056] 
此迭代的每个第一次会话在上一次迭代的最后一次结束后开始。但是,postgres课程需要一点时间来结束它 全局并行执行的感觉。但实际上,迭代是连续的,内部是并行的


谢谢

您需要将结果列表展平,而不是效果列表。此外,您应该考虑<代码>括号< /> >或<代码>托管< /代码>,以处理打开和关闭数据库连接,这样您就不必担心这一点。我在下面举了一个例子

导入zio_ 导入zio.console_ 对象示例扩展了应用程序{ 最终案例类结果(迭代:Int,值:Int) def execute(迭代:Int,值:Int):URIO[控制台,结果]= console.putStrLn(s“执行迭代$iteration,value$value”).as(结果(迭代,value)) def executeSession(迭代:Int,值:List[Int]):URIO[Console,List[Result]]= URIO.括号[控制台、装置、列表[结果]]( console.putStrLn(s“打开数据库连接$iteration”), _=>console.putStrLn(s“关闭数据库连接$iteration”), _=>URIO.foreachPar(值)(值=>execute(迭代,值)) ) def执行(迭代次数:Int,值:List[Int]):URIO[控制台,List[Result]]= 乌里奥 .foreach(List.range(1,迭代+1)){iteration=> 执行会话(迭代、值) } .map(展平) def程序(n:Int):URIO[控制台,列表[结果]]= 死刑(n,名单(10,20,30)) def run(args:List[String]):ZIO[ZEnv,Nothing,Int]= 程序(4).as(0) }
您需要将结果列表展平,而不是效果列表。此外,您应该考虑<代码>括号< /> >或<代码>托管< /代码>,以处理打开和关闭数据库连接,这样您就不必担心这一点。我在下面举了一个例子

导入zio_ 导入zio.console_ 对象示例扩展了应用程序{ 最终案例类结果(迭代:Int,值:Int) def execute(迭代:Int,值:Int):URIO[控制台,结果]= console.putStrLn(s“执行迭代$iteration,value$value”).as(结果(迭代,value)) def executeSession(迭代:Int,值:List[Int]):URIO[Console,List[Result]]= URIO.括号[控制台、装置、列表[结果]]( console.putStrLn(s“打开数据库连接$iteration”), _=>console.putStrLn(s“关闭数据库连接$iteration”), _=>URIO.foreachPar(值)(值=>execute(迭代,值)) ) def执行(迭代次数:Int,值:List[Int]):URIO[控制台,List[Result]]= 乌里奥 .foreach(List.range(1,迭代+1)){iteration=> 执行会话(迭代、值) } .map(展平) def程序(n:Int):URIO[控制台,列表[结果]]= 死刑(n,名单(10,20,30)) def run(args:List[String]):ZIO[ZEnv,Nothing,Int]= 程序(4).as(0) }
 iter : [1] test : [1] pid=[13505] startTs [1575955678690] endTs [1575955678756] 
 iter : [1] test : [4] pid=[13510] startTs [1575955678691] endTs [1575955678883] 
 iter : [1] test : [6] pid=[13508] startTs [1575955678697] endTs [1575955678965] 
 iter : [1] test : [5] pid=[13507] startTs [1575955678697] endTs [1575955679106] 
 iter : [1] test : [2] pid=[13506] startTs [1575955678693] endTs [1575955679208] 
 iter : [1] test : [3] pid=[13509] startTs [1575955678697] endTs [1575955680438] 

iter : [2] test : [1] pid=[13514] startTs [1575955680653] endTs [1575955681291] 
 iter : [2] test : [4] pid=[13517] startTs [1575955681071] endTs [1575955681367] 
 iter : [2] test : [5] pid=[13518] startTs [1575955681071] endTs [1575955681396] 
 iter : [2] test : [6] pid=[13519] startTs [1575955681276] endTs [1575955681484] 
 iter : [2] test : [2] pid=[13515] startTs [1575955681071] endTs [1575955681645] 
 iter : [2] test : [3] pid=[13516] startTs [1575955681106] endTs [1575955682712] 

iter : [3] test : [1] pid=[13521] startTs [1575955682830] endTs [1575955682903] 
 iter : [3] test : [4] pid=[13524] startTs [1575955682819] endTs [1575955682938] 
 iter : [3] test : [6] pid=[13526] startTs [1575955682832] endTs [1575955683137] 
 iter : [3] test : [5] pid=[13525] startTs [1575955682863] endTs [1575955683428] 
 iter : [3] test : [2] pid=[13522] startTs [1575955682816] endTs [1575955683476] 
 iter : [3] test : [3] pid=[13523] startTs [1575955682902] endTs [1575955684056]