首页 文章

多个进程等待同一个Future完成(scala)

提问于
浏览
0

我现在没有直接使用它,但这个问题刚刚出现在我脑海中,无法在网上找到一个好的答案:

我有一个函数'callExactKeyFromDB'返回:[A,Future [A]](A =来自本地内存缓存,Future [A] =查询数据库) . 我可以将Future传递给不同的线程/执行上下文并让它们全部注册在'onComplete'上,或者更好的是每次调用此函数时我都会返回一个新的未来,保留已注册的期货列表并在我完成后完成它们能够 .

现在的问题是我能用1 Future做到吗?我应该这样做吗?

(想象一下4个进程从数据库请求用户信息并等待它继续)

2 回答

  • 0

    是的,您可以使用单个 Future 注册多个回调 . 这需要更少的代码,更少的内存,并且更具可读性 .

  • 0

    我会摆脱 Either[A,Future[A]] 并将其转换为 Future[A] 开头 .

    def getUserByKey(key:Int) : Future[User] =
      cache.users.contains(key) match {
        case true  => Future(cache.users(key))
        case false => Future(User(key = 101, name = "John Doe")) // db call
      }
    

    这会让事情简单得多,我想...

    如果在上下文之间共享 cache ,则一旦保存,就不需要对数据库进行更多调用来获取该特定用户 .

    def saveUserCache(u:User) : Future[Unit] = Future{
      cache.users.contains(u.key) match {
        case true  => cache.users(u.key) = u
        case false => cache.users += (u.key -> u)
      }
    }
    

    然后人们可以混合这些期货创造其他期货

    def renderUser(key:Int) : Future[String] =
      for {
        user   : User    <-  getUserByKey(key)
        update : Unit    <-  saveUserCache(user)
        output : String  <-  Future(s"${user.key}: ${user.name}")
      } yield output
    

    这回答了你的问题了吗?

相关问题