See also Thread Mailboxes.
An asynchronous channel is like a channel, but it buffers values so that a send operation does not wait on a receive operation.
In addition to its use with procedures that are specific to asynchronous channels, an asynchronous channel can be used as a synchronizable event (see Events). An asynchronous channel is ready for synchronization when async-channel-get would not block; the asynchronous channel’s synchronization result is the same as the async-channel-get result.
limit : (or/c exact-positive-integer? #f) = #f
(define (server input-channel output-channel) (thread (lambda () (define (get) (async-channel-get input-channel)) (define (put x) (async-channel-put output-channel x)) (define (do-large-computation) (sqrt 9)) (let loop ([data (get)]) (case data [(quit) (void)] [(add) (begin (put (+ 1 (get))) (loop (get)))] [(long) (begin (put (do-large-computation)) (loop (get)))]))))) (define to-server (make-async-channel)) (define from-server (make-async-channel))
> (server to-server from-server)
> (async-channel? to-server)
> (printf "Adding 1 to 4\n")
Adding 1 to 4
> (async-channel-put to-server 'add)
> (async-channel-put to-server 4)
> (printf "Result is ~a\n" (async-channel-get from-server))
Result is 5
> (printf "Ask server to do a long computation\n")
Ask server to do a long computation
> (async-channel-put to-server 'long)
> (printf "I can do other stuff\n")
I can do other stuff
> (printf "Ok, computation from server is ~a\n" (async-channel-get from-server))
Ok, computation from server is 3
> (async-channel-put to-server 'quit)
If the c argument is a flat contract or a chaperone contract, then the result will be a chaperone contract. Otherwise, the result will be an impersonator contract.
When an async-channel/c contract is applied to an asynchronous channel, the result is not eq? to the input. The result will be either a chaperone or impersonator of the input depending on the type of contract.
(impersonate-async-channel channel get-proc put-proc prop prop-val ... ...) → (and/c async-channel? impersonator?) channel : async-channel? get-proc : (any/c . -> . any/c) put-proc : (any/c . -> . any/c) prop : impersonator-property? prop-val : any
The get-proc must accept the value that async-channel-get produces on channel; it must produce a replacement value, which is the result of the get operation on the impersonator.
The put-proc must accept the value passed to async-channel-put called on channel; it must produce a replacement value, which is the value passed to the put procedure called on the original channel.
(chaperone-async-channel channel get-proc put-proc prop prop-val ... ...) → (and/c async-channel? chaperone?) channel : async-channel? get-proc : (any/c . -> . any/c) put-proc : (any/c . -> . any/c) prop : impersonator-property? prop-val : any