Tương lai JavaScript so với lời hứa

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ặn

Theo 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[]
    // ...
  }
}
8

Bố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án

Mộ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 

Chủ Đề