2017-03-13 74 views
0

我不現在有這方面的直接使用,但這個問題只在我的頭上彈出,但沒有找到一個很好的答案在網上:多個進程等待同未來完成(斯卡拉)

我有一個函數'callExactKeyFromDB'返回:[A,Future [A]](A =從內存緩存中的本地,Future [A] =查詢DB)。我可以將這個未來傳遞給不同的線程/執行上下文,並讓他們在'onComplete'上註冊,或者每次調用這個函數時我都會更好 - 我會返回一個新的未來,保留已註冊期貨的列表,並且一次完成它們能夠。

現在的問題是我可以做到1未來,我應該這樣做嗎?

(想象一下,4個流程請求從DB用戶信息,正在等待它繼續)

+1

1)您可以撰寫'期貨',例如'將[未來]列入'未來[列表]',但是否應該是另一回事。 2)郵政編碼把所有東西都放到上下文中。 – sebszyller

回答

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 

這是否回答你的問題?

+0

我明白了爲什麼你想擺脫這兩者之一,但這裏是折衷:如果我需要調用next()函數,模式匹配(甚至2個ifs)或者返回一個完整的未來? – ovanwijk