Qua. Philipp Haller, Aleksandar Prokopec, Heather Miller, Viktor Klang, Roland Kuhn và Vojin Jovanovic
Giới thiệu
Hợp đồng tương lai cung cấp một cách lý luận về việc thực hiện nhiều hoạt động song song– một cách hiệu quả và không bị chặn. Một
import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
2 là một đối tượng giữ chỗ cho một giá trị có thể chưa tồn tại. Nói chung, giá trị của Tương lai được cung cấp đồng thời và sau đó có thể được sử dụng. Soạn các tác vụ đồng thời theo cách này có xu hướng dẫn đến mã song song nhanh hơn, không đồng bộ, không chặnTheo mặc định, các hợp đồng tương lai và lời hứa không bị chặn, sử dụng các cuộc gọi lại thay vì các hoạt động chặn thông thường. Để đơn giản hóa việc sử dụng các lệnh gọi lại cả về mặt cú pháp và khái niệm, Scala cung cấp các bộ kết hợp như
import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
3, import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
4 và import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
5 được sử dụng để soạn hợp đồng tương lai theo cách không chặn. Vẫn có thể chặn - đối với những trường hợp thực sự cần thiết, hợp đồng tương lai có thể bị chặn [mặc dù điều này không được khuyến khích]Một tương lai điển hình trông như thế này
val inverseFuture: Future[Matrix] = Future {
fatMatrix.inverse[] // non-blocking long lasting computation
}[executionContext]
Hoặc với thành ngữ hơn
implicit val ec: ExecutionContext = ...
val inverseFuture : Future[Matrix] = Future {
fatMatrix.inverse[]
} // ec is implicitly passed
given ExecutionContext = ...
val inverseFuture : Future[Matrix] = Future {
fatMatrix.inverse[]
} // execution context is implicitly passed
Cả hai đoạn mã đều ủy thác việc thực thi
import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
6 cho một import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
7 và thể hiện kết quả tính toán trong import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
8Bối cảnh thực hiện
Tương lai và Lời hứa xoay quanh
import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
7s, chịu trách nhiệm thực hiện các tính toánMột
import scala.concurrent.Future
import scala.concurrent.blocking
Future {
blocking {
myLock.lock[]
// ...
}
}
7 tương tự như một Executor. có thể tự do thực hiện các tính toán trong một luồng mới, trong một luồng gộp hoặc trong luồng hiện tại [mặc dù việc thực hiện tính toán trong luồng hiện tại không được khuyến khích – hãy nói thêm về điều đó bên dưới]Gói
implicit val ec = ExecutionContext.global
for [i