A hybrid approach to asynchronous programming
By using non-preemptive user-level threads with first-class blocking operations, Async avoids the performance compromises and synchronization woes of preemptive threads, without producing the confusing inversion of control that usually comes with event-driven systems.
High-level APIs and syntactic sugar simplify asynchronous code
When used with our
ppx_let syntax extension, Async’s monadic
interface means non-blocking code can be just as clean and readable as
First-class blocking operations that are expressed in the type system
OCaml’s type system knows about Async’s primitives, which means you can be confident about which code blocks, and which doesn’t, at compile-time. Helpful type errors make it clear when you are mixing asynchronous and synchronous code.
(* A non-blocking echo server *) open Core open Async let run () = let%bind server = Tcp.Server.create ~on_handler_error:`Raise (Tcp.Where_to_listen.of_port 8765) (fun _addr r w -> Pipe.transfer ~f:Fn.id (Reader.pipe r) (Writer.pipe w)) in Tcp.Server.close_finished server let () = Command.async ~summary:"An echo server" (Command.Param.return run) |> Command.run
$ opam install async
See here for async’s opam package file.
open Core open Async
More docs, including detailed API docs, are available here.
Async comprises three packages,
Async_kernel contains Async’s core data structures, like
Async_js. In principle it could also be used on Windows, but no scheduler has been written for Async on Windows as of yet.
Async_unix adds Unix dependencies for connections and the scheduler (and manages e.g., hooking into epoll).
Async_extra includes extras like command-line handling and RPC support built on top of those two packages.
Real World OCaml chapter on Asynchronous Programming
Async is discussed in depth in Chapter 18 of Real World OCaml.
Async’s API is broken into three packages,
Async_extra, all documented extensively here.
A class on Async
Cornell’s CS department did a recitation on programming with Async that you can read here.