By parts:
- do some asynchronous work concurrently
Use a Task.Supervisor
- kill the work when the parent GenServer exits
Use Task.Supervisor.async but notice you can’t use await, you will receive the done or the down message in your handle_info
- be able to specify the timeout
When you call Task.Supervisor.async, also call Process.send_after(self, {:kill, task}, timeout). You will receive that message In handle_info, kill the task if timeout has passed
- do some bookkeeping when the work succeeds
Match the {ref, result} message in handle_info and cancel the timeout started above
- do some other bookkeeping when the work fails
Match the DOWN message in handle_info and cancel the timeout started above. Also make sure you call Process.flag(:trap_exit, true) so your genserver doesn’t die when the task crashes






















