10.4 Futures
Parallelism with Futures in Guide: Racket introduces futures.
Currently, parallel support for future is enabled by default for Windows, Linux x86/x86_64, and Mac OS X x86/x86_64. To enable support for other platforms, use --enable-futures with configure when building Racket.
The future and touch functions from racket/future provide access to parallelism as supported by the hardware and operating system. In contrast to thread, which provides concurrency for arbitrary computations without parallelism, future provides parallelism for limited computations. A future executes its work in parallel (assuming that support for parallelism is available) until it detects an attempt to perform an operation that is too complex for the system to run safely in parallel. Similarly, work in a future is suspended if it depends in some way on the current continuation, such as raising an exception. A suspended computation for a future is resumed when touch is applied to the future.
“Safe” parallel execution of a future means that all operations
provided by the system must be able to enforce contracts and produce
results as documented. “Safe” does not preclude concurrent access to
mutable data that is visible in the program. For example, a
computation in a future might use set! to modify a shared
variable, in which case concurrent assignment to the variable can be
visible in other futures and threads. Furthermore, guarantees about
the visibility of effects and ordering are determined by the operating
system and hardware—
Between a call to future and touch for a given future, the given thunk may run speculatively in parallel to other computations, as described above.
| ||
'(7 3) |
(current-future) → (or/c #f future?) |