Building Non Blocking Erlang apps
Also: Why does this simple GenServer timeout?
Your could for example launch the calculation call via Task.async/1
which gives you a %Task{owner: term(), pid: term(), ref: term()}
. Store that together with the caller details in the GenServer state.
When the task is done, you’ll get a {ref,result}
via handle_info
and you can complete the call with GenServer.reply/2
.
For a cleaner result, also take care of the details like Task.await does, i.e. demonitor and process :DOWN
messages