Lập trình Future với Scala
TIL
781
Scala
50
White

Vu Nhat Minh viết ngày 25/05/2016

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

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

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Vu Nhat Minh

56 bài viết.
942 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
144 32
Nếu bạn thường vào trang mua sắm của amazon, chắc sẽ chẳng lạ gì với menu Shop by Department. Tốc độ hiển thị nội dung của menu là tức thì so với d...
Vu Nhat Minh viết hơn 5 năm trước
144 32
White
114 4
Lời người dịch Người dịch là một developer , sau khi tìm đọc được bài viết này bằng bản gốc tiếng Anh đã cảm thấy như được "khai sáng" về khả năng...
Vu Nhat Minh viết gần 6 năm trước
114 4
White
82 7
Form là thành phần quan trọng nhất khi design flow đăng ký của 1 web hay 1 app, dù là view gồm nhiều bước hay chỉ là một màn hình đơn điệu. Bài này...
Vu Nhat Minh viết 4 năm trước
82 7
Bài viết liên quan
White
10 0
Kí tự Regex cơ bản Về cơ bản thì các sử lý matching của scala.util.matching.Regex sẽ được "phó thác" (delegate) cho java Regex. Bạn có thể tạo một ...
huydx viết gần 6 năm trước
10 0
White
7 1
Trong scala kí tự _ được dùng với khá nhiều mục đích .. không liên quan đến nhau. Tạm note lại cái đã khi nào có time sẽ quay lại viết cẩn thận sa...
huydx viết gần 6 năm trước
7 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
56 bài viết.
942 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!