Đây là phiên bản hiển thị mức độ chặn của bạn fallback
.
Lưu ý rằng người thực thi là một chuỗi duy nhất và bạn đang tạo nhiều hạn chế.
@cmbaxter đúng, thời gian chờ chính của bạn không được là timeout * futures.size
, nó phải lớn hơn!
@cmbaxter cũng đúng mà bạn muốn nghĩ là không bị chặn. Một khi bạn làm điều đó, và bạn muốn áp đặt timeouts, sau đó bạn sẽ chọn một thành phần bộ đếm thời gian cho điều đó, xem câu trả lời được liên kết của mình (cũng được liên kết từ câu trả lời được liên kết của bạn).
Điều đó nói rằng, tôi vẫn thích my answer from your link, cho đến nay khi ngồi trong một vòng lặp chờ đợi điều tiếp theo nên thời gian chờ thực sự đơn giản.
Chỉ cần danh sách tương lai và thời gian chờ của chúng và giá trị dự phòng.
Có lẽ đó là một trường hợp sử dụng cho điều đó, chẳng hạn như một ứng dụng đơn giản rằng chỉ cần khối đối với một số kết quả (như thử nghiệm của bạn) và không thoát ra trước khi kết quả là trong
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext
import java.util.concurrent.Executors
import java.lang.System.{ nanoTime => now }
object Test extends App {
//implicit val xc = ExecutionContext.global
implicit val xc = ExecutionContext fromExecutorService (Executors.newSingleThreadExecutor)
def timed[A](body: =>A): A = {
val start = now
val res = body
val end = now
Console println (Duration fromNanos end-start).toMillis + " " + res
res
}
println("Creating futureList")
val timeout = 1500 millis
val futures = List(1000, 1500, 1200, 800, 2000) map { ms =>
val f = future {
timed {
blocking(Thread sleep ms)
ms toString
}
}
Future firstCompletedOf Seq(f, fallback(timeout))
}
println("Creating waitinglist")
val waitingList = Future sequence futures
println("Created")
timed {
val results = Await result (waitingList, 2 * timeout * futures.size)
println(results)
}
xc.shutdown
def fallback(timeout: Duration) = future {
timed {
blocking(Thread sleep (timeout toMillis))
"-1"
}
}
}
gì đã xảy ra:.
Creating futureList
Creating waitinglist
Created
1001 1000
1500 -1
1500 1500
1500 -1
1200 1200
1500 -1
800 800
1500 -1
2000 2000
1500 -1
List(1000, 1500, 1200, 800, 2000)
14007()
Vì sự tò mò, cách 'HashedWheelTimer' hiệu quả hơn' TimerTask' hoặc 'newScheduledThreadPoolExecutor'? Cả hai đều làm cùng một công việc. – Jatin
@Jatin, tôi cho rằng bạn có thể xem liên kết này để biết thêm thông tin: http://stackoverflow.com/questions/15347600/which-is-more-efficient-nettys-hashedwheeltimer-or-quartzs-scheduler. Nhưng ở trung tâm của nó, việc thêm nhiều nhiệm vụ hơn không nên tiêu tốn nhiều tài nguyên hơn. Nó được coi là một thời gian liên tục hơn (về nguồn tài nguyên hệ thống tiêu thụ) dựa trên bộ đếm thời gian sau đó một cái gì đó giống như một 'Timer' và' TimerTask'. Đối với một hệ thống thông lượng cao, nơi bạn sẽ lên kế hoạch rất nhiều và rất nhiều thời gian chờ ngắn dựa trên nhiệm vụ, đó là một giải pháp tốt hơn vì các tuyên bố sử dụng tài nguyên liên tục. – cmbaxter
Nhưng cách 'STPE' với' coresize' '1' tiêu thụ nhiều tài nguyên hơn khi so sánh với' HashedWheelTimer' như thế nào? Tôi xin lỗi nhưng tôi không hiểu. 'STPE' có thời gian chèn thêm do heap nội bộ' O (log (n)) 'nhưng thời gian đánh dấu ít hơn. Bạn có thể vui lòng giải thích – Jatin