Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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 &引用;“繁殖”;WebSocket端点中的并发效应_Scala_Http4s_Cats Effect - Fatal编程技术网

Scala &引用;“繁殖”;WebSocket端点中的并发效应

Scala &引用;“繁殖”;WebSocket端点中的并发效应,scala,http4s,cats-effect,Scala,Http4s,Cats Effect,我有以下代码: class ApiRoutes2[F[_]](implicit F: ConcurrentEffect[F]) extends Http4sDsl[F] { var queue = Queue.bounded[F, String](100) def createService(queue: Queue[F, String]): F[Unit] = ??? val service: HttpRoutes[F] = HttpRoutes.of[F] { cas

我有以下代码:

class ApiRoutes2[F[_]](implicit F: ConcurrentEffect[F]) extends Http4sDsl[F] {
  var queue = Queue.bounded[F, String](100)

  def createService(queue: Queue[F, String]): F[Unit] = ???

  val service: HttpRoutes[F] = HttpRoutes.of[F] {
    case PUT -> Root / "services" =>
      val toClientF: F[Stream[F, WebSocketFrame]] = queue.map(_.dequeue.map(t => Text(t)))
      val fromClient: Pipe[F, WebSocketFrame, Unit] = _.evalMap {
        case Text(t, _) => F.delay(println(t))
        case f => F.delay(println(s"Unknown type: $f"))
      }

      // How to "spawn" createService?

      toClientF.flatMap { toClient =>
        WebSocketBuilder[F].build(toClient, fromClient)
      }
  }
}
createService
是一个创建新服务的函数。创建新服务是一个非常复杂的过程,它会触发CI管道,等待它们完成,然后以相同的方式触发更多CI管道。它接收的队列将用于向浏览器报告当前正在执行的操作

我想同时“生成”createService并让它运行直到完成。但是,同时我想立即将WebSocket返回给客户端。“生成”createService时无法阻止

我卡住了。我只能考虑使用
shift
,但这意味着理解中的下一行将阻止等待
createService
完成,然后将websocket返回给客户端


我的方法错了吗?我做错了什么?

既然
F
ConcurrentEffect
的一个实例,那么您也有一个实例

因此,您可以使用
Concurrent[F].start
,它将返回一个到正在运行的操作的值(如果不需要取消/确保完成,您可以忽略光纤)

val服务:HttpRoutes[F]=HttpRoutes.of[F]{
案例放置->根目录/“服务”=>
val-toClientF:F[Stream[F,WebSocketFrame]=queue.map(uqueue.dequeue.map(t=>Text(t)))
val fromClient:Pipe[F,WebSocketFrame,Unit]=\uu0.evalMap{
案例文本(t,)=>F.delay(println(t))
案例f=>f.delay(println(s“未知类型:$f”))
}
为了{
托克特
  val service: HttpRoutes[F] = HttpRoutes.of[F] {
    case PUT -> Root / "services" =>
      val toClientF: F[Stream[F, WebSocketFrame]] = queue.map(_.dequeue.map(t => Text(t)))
      val fromClient: Pipe[F, WebSocketFrame, Unit] = _.evalMap {
        case Text(t, _) => F.delay(println(t))
        case f => F.delay(println(s"Unknown type: $f"))
      }

      for {
        toClient <- toClientF
        _ <- Concurrent[F].start(createService)
        websocket <- WebSocketBuilder[F].build(toClient, fromClient)
      } yield websocket
  }