mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
doc: Document nested futures.
* doc/ref/api-scheduling.texi (Futures): Mention nested futures. Explain what happens upon `touch'.
This commit is contained in:
parent
8eccf6cdbd
commit
a638be152c
1 changed files with 29 additions and 1 deletions
|
@ -982,6 +982,24 @@ machine, though, the computation of @code{(find prime? lst2)} may be
|
|||
done in parallel with that of the other @code{find} call, which can
|
||||
reduce the execution time of @code{find-prime}.
|
||||
|
||||
Futures may be nested: a future can itself spawn and then @code{touch}
|
||||
other futures, leading to a directed acyclic graph of futures. Using
|
||||
this facility, a parallel @code{map} procedure can be defined along
|
||||
these lines:
|
||||
|
||||
@lisp
|
||||
(use-modules (ice-9 futures) (ice-9 match))
|
||||
|
||||
(define (par-map proc lst)
|
||||
(match lst
|
||||
(()
|
||||
'())
|
||||
((head tail ...)
|
||||
(let ((tail (future (par-map proc tail)))
|
||||
(head (proc head)))
|
||||
(cons head (touch tail))))))
|
||||
@end lisp
|
||||
|
||||
Note that futures are intended for the evaluation of purely functional
|
||||
expressions. Expressions that have side-effects or rely on I/O may
|
||||
require additional care, such as explicit synchronization
|
||||
|
@ -995,6 +1013,15 @@ pool contains one thread per available CPU core, minus one, to account
|
|||
for the main thread. The number of available CPU cores is determined
|
||||
using @code{current-processor-count} (@pxref{Processes}).
|
||||
|
||||
When a thread touches a future that has not completed yet, it processes
|
||||
any pending future while waiting for it to complete, or just waits if
|
||||
there are no pending futures. When @code{touch} is called from within a
|
||||
future, the execution of the calling future is suspended, allowing its
|
||||
host thread to process other futures, and resumed when the touched
|
||||
future has completed. This suspend/resume is achieved by capturing the
|
||||
calling future's continuation, and later reinstating it (@pxref{Prompts,
|
||||
delimited continuations}).
|
||||
|
||||
@deffn {Scheme Syntax} future exp
|
||||
Return a future for expression @var{exp}. This is equivalent to:
|
||||
|
||||
|
@ -1024,7 +1051,8 @@ Return the result of the expression embedded in future @var{f}.
|
|||
|
||||
If the result was already computed in parallel, @code{touch} returns
|
||||
instantaneously. Otherwise, it waits for the computation to complete,
|
||||
if it already started, or initiates it.
|
||||
if it already started, or initiates it. In the former case, the calling
|
||||
thread may process other futures in the meantime.
|
||||
@end deffn
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue