I'm used to languages where the request handlers run on a thread, so all I/O functions have an async version to prevent blocking the thread.
In Elixir, each request is handled in a lightweight process (actor?), and the runtime can multiplex thousands of actors on a single OS thread. If an actor blocks, the runtime swaps another actor to use the cpu. Since, an actor can block without blocking the thread, I don't see the point of async functions in Elixir. Yet, I came across this in the HTTPotion documentation:
iex> HTTPotion.get "http://floatboth.com", [], [stream_to: self]
%HTTPotion.AsyncResponse{id: {1372,8757,656584}}
What's the point of an async function here?