是否可以使用Doobie并行运行多个查询?
我有以下(伪)查询:
def prepareForQuery(input: String): ConnectionIO[Unit] = ???
val gettAllResults: ConnectionIO[List[(String, BigDecimal)]] = ???
def program(input : String) : ConnectionIO[List[(String, BigDecimal)]] = for{
_ <- prepareForQuery(input)
r <- gettAllResults
} yield r我尝试了以下几点:
import doobie._
import doobie.implicits._
import cats.implicits._
val xa = Transactor.fromDataSource[IO](myDataSource)
val result = (program(i1),program(i2)).parMapN{case (a,b) => a ++ b}
val rs = result.transact(xa).unsafeRunSync但是,没有为NonEmptyParallel找到ConnectionIO实例。
错误:(107,54)找不到参数p的隐式值: cats.NonEmptyParalleldoobie.ConnectionIO,F val result =(i1,i2).parMapN{case (a,b) => a ++ b}
我是错过了一些显而易见的事情,还是尝试了一些无法完成的事情?谢谢
发布于 2020-09-16 07:04:46
不能在ConnectionIO monad中并行运行查询。但是,一旦您将它们转换为实际的运行时monad (只要它有一个并行实例),您就可以。
例如,使用cats effect IO运行时monad:
def prepareForQuery(input: String): ConnectionIO[Unit] = ???
val gettAllResults: ConnectionIO[List[(String, BigDecimal)]] = ???
def program(input : String) : ConnectionIO[List[(String, BigDecimal)]] = for{
_ <- prepareForQuery(input)
r <- gettAllResults
} yield r将您的ConnectionIO转换为IO
val program1IO: IO[List[(String, BigDecimal)]]] = program(i1).transact(xa)
val program2IO: IO[List[(String, BigDecimal)]]] = program(i2).transact(xa)你现在有了一个可以并行做事情的单子。
val result: IO[List[(String, BigDecimal)]]] =
(program1IO, program2IO).parMapN{case (a,b) => a ++ b}为了理解为什么ConnectionIO不允许您并行地做事情,我将引用tpolecat的话:
您不能并行运行ConnectionIO。它是一种描述连接的使用的语言,它是一个线性的操作序列。在IO中使用parMapN,是的,您可以同时运行两件事情,因为它们运行在不同的连接上。没有带有parMapN的ConnectionIO,因为它没有(也不能)有一个并行实例。
https://stackoverflow.com/questions/50833774
复制相似问题