10.5 Places
Parallel support for place is currently disabled by default. Enable places by supplying --enable-places to configure when building Racket.
Places enable the development of parallel programs that take advantage of machines with multiple processors, cores, or hardware threads.
A place is a parallel task that is effectively a separate instance of the Racket virtual machine. Places communicate through place channels, which are endpoints for a two-way buffered communication.
To a first approximation, place channels allow only immutable values as messages over the channel: numbers, characters, booleans, immutable pairs, immutable vectors, and immutable structures. In addition, place channels themselves can be sent across channels to establish new (possibly more direct) lines of communication in addition to any existing lines. Finally, mutable values produced by shared-flvector, make-shared-flvector, shared-fxvector, make-shared-fxvector, shared-bytes, and make-shared-bytes can be sent across place channels; mutation of such values is visible to all places that share the value, because they are allowed in a shared memory space.
A place channel can be used as a synchronizable event (see Events) to receive a value through the channel. A place can also receive messages with place-channel-recv, and messages can be sent with place-channel-send.
Constraints on messages across a place channel—
For example, the following expression lanches two places, echoes a message to each, and then waits for the places to complete and return:
(let ([pls (for/list ([i (in-range 2)]) |
(place "place-worker.rkt" 'place-main))]) |
(for ([i (in-range 2)] |
[p pls]) |
(place-channel-send p i) |
(printf "~a\n" (place-channel-recv p))) |
(map place-wait pls)) |
The "place-worker.rkt" module must export the place-main function that each place executes, where place-main must accept a single place channel argument:
#lang racket |
(provide place-main) |
(define (place-main pch) |
(place-channel-send pch (format "Hello from place ~a" |
(place-channel-recv pch)))) |
(place-channel? v) → boolean? |
v : any/c |
(place module-path start-proc) → place? |
module-path : module-path? |
start-proc : symbol? |
The module indicated by module-path must export a function with the name start-proc. The function must accept a single argument, which is a place channel that corresponds to the other end of communication for the place descriptor returned by place.
(place-wait p) → exact-integer? |
p : place? |
Typically, one place channel is used by the current place to send messages to a destination place; the other place channel us sent to the destination place (via an existing place channel).
(place-channel-send pch v) → void |
pch : place-channel? |
v : any/c |
(place-channel-recv pch) → any/c |
pch : place-channel? |
(place-channel-send/recv pch v) → void |
pch : place-channel? |
v : any/c |