Scala 可以使用“吗?”;不同步();猫的特效?

Scala 可以使用“吗?”;不同步();猫的特效?,scala,scala-cats,cats-effect,doobie,Scala,Scala Cats,Cats Effect,Doobie,我使用的是Doobie,它使用了unsafeRunSync,比如: sql"select name from country" .query[String] // Query0[String] .to[List] // ConnectionIO[List[String]] .transact(xa) // IO[List[String]] .unsafeRunSync // List[String] .take(5)

我使用的是Doobie,它使用了
unsafeRunSync
,比如:

sql"select name from country"
  .query[String]    // Query0[String]
  .to[List]         // ConnectionIO[List[String]]
  .transact(xa)     // IO[List[String]]
  .unsafeRunSync    // List[String]
  .take(5)          // List[String]
  .foreach(println)
在发动机罩下,此功能的实现如下:

final def unsafeRunSync(): A = unsafeRunTimed(Duration.Inf).get
,我发现“请注意,此函数用于测试;它不应出现在主线生产代码中!”。我想知道如果在引擎盖下使用此功能,是否可以在生产中使用
unsafeRunSync


另外,如果不使用
unsafeRunTimed
,我如何在执行时设置超时?

好的,这取决于“OK”的确切含义。我不知道有任何法律限制使用
unsafeRunSync
方法。我也不认为任何主要的宗教认为这是一种罪恶(尽管一些次要的宗教肯定会这样)

也就是说,调用
unsafeRunSync
在引用上是不透明的,并且具有所有随之而来的缺点。也就是说,等式推理是不存在的。如果在任何时候都涉及异步处理,它也会阻止调用线程(在ScalaJS中,在这种情况下它根本不起作用)。对我来说,这些都是尽可能避免在生产代码中使用它的充分理由。也就是说,有些情况是不可能的。例如,您有时需要实现期望执行副作用的接口,例如
java.io.OutputStream
。在这种情况下你无能为力,那些签名就是这样


但是,无需调用
unsafeRunTimed
来执行超时操作。只需使用和。

一个
IO
monad的想法是暂停所有的副作用,并将它们组合成一个更大的
IO
,代表整个程序。此时,您可以调用一个
不安全的
方法来实际运行您的程序您也可以使用
IOApp
,这样您就不需要调用它们中的任何一个,因为这一个需要
IO
,并且它在内部执行它-现在,考虑到您的问题,我假设您不熟悉纯FP,如果您只想使用doobie运行一些查询,我想对于您的用例来说,最简单的方法就是在
IO
unsafeRunSync
上调用
unsafeRunToFuture