Scala 齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥·齐奥
我有一个下一个任务,有N个db查询(例如3-Seq(10,20,30))和iterationCount=4。 我希望使用ZIO和next:顺序执行迭代,并在迭代内部并行评估效果 简化代码如下所示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
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]