Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Lập trình Future với Scala
Future trong Scala có rất nhiều ứng dụng nhưng có một vài cách dùng chính
Future chạy song song với Main Thread
Tạo một Future về cơ bản là ném xử lý cho một thread khác sẽ chạy song song với Main Thread
import scala.concurrent._
import ExecutionContext.Implicits.global
val f = Future(10)
Future độc lập
Tạo một Future độc lập (ở luôn trạng thái đã thực thi xong) không cần Execution Context
import scala.concurrent._
val g = Future.successful(10)
val h = Future.failed{ new Exception("Error in The Future") }
Nhiều Future chạy song song
Future.sequence
import scala.concurrent._
import ExecutionContext.Implicits.global
val futures: List[Future[Int]] = (1 to 10).toList.map(i => Future(i))
val f: Future[List[Int]] = Future.sequence(futures)
Ở đây mình đã biến List[Future]
thành Future[List]
. Khi thực thi f thì 10 Future bên trong sẽ chạy song song bằng các thread độc lập với Main Thread. Kết quả trả về là List[Int]
Future.traverse
import scala.concurrent._
import ExecutionContext.Implicits.global
val futures: Future[List[Int]] = Future.traverse((1 to 10).toList)(i => Future(i))
Ở đây kết quả sẽ là kiểu Future[List]
sau khi gọi Future.traverse
Future.firstCompletedOf
Cho nhiều Future chạy song song và trả về thằng hoàn thành trước nhất
import scala.concurrent._
import ExecutionContext.Implicits.global
val futures: List[Future[Int]] = (1 to 10).toList.map(i => Future(i))
val f: Future[Int] = Future.firstCompletedOf(futures)
Future.find
Cho nhiều Future chạy song song và trả về thằng hoàn thành trước nhất thỏa mãn điều kiện
import scala.concurrent._
import ExecutionContext.Implicits.global
val futures: List[Future[Int]] = (1 to 10).toList.map(i => Future(i))
val f: Future[Option[Int]] = Future.find(futures){ _ % 3 == 1 } // Ket qua chia het cho 3
Vì find
có thể không tìm thấy, nên giá trị trả về ở đây sẽ là Option[Int]
Future.reduce và Future.fold
Kết hợp kết quả của nhiều Future chạy song song. Có thể dùng reduce hoặc fold
import scala.concurrent._
import ExecutionContext.Implicits.global
val futures: List[Future[Int]] = (1 to 10).toList.map(i => Future(i))
val f: Future[Int] = Future.reduce(futures){ (r,v) => r+v }
val g: Future[Int] = Future.fold(futures)(-5){ (r,v) => r+v }
Ở đây mình cộng dồn với kết quả trả về từ các Future. Hàm reduce
chỉ đơn giản trả về tổng, còn hàm fold
sẽ lấy giá trị đầu tiên -5
rồi mới thực hiện cộng dồn.
VuNhatMinh 25-05-2016






