fireproofsocks

fireproofsocks

Restarting a task that can be awaited on

I’m starting to get deeper into the subtleties of supervisors and I could use some help understanding how and when to restart failed tasks.

Given I have a risky_function() that may raise errors, I can ensure that it eventually completes by supervising a task that calls it by doing something like this (assume MyTaskSupervisor is started):

Task.Supervisor.start_child(MyTaskSupervisor, fn -> 
  risky_work() end, 
  restart: :transient)

Even if the risky_work function hits errors, it restarts and it eventually completes successfully.

This is (I think) an example of a non-awaited task. How would this need to be structured if I wanted that same risky_work to be part of an awaited task?

The following attempt doesn’t ensure that the task completes:

task = Task.Supervisor.async_nolink(MyTaskSupervisor, fn ->
  risky_work()
end)
Task.await(task) # or Task.yield(task)

The risky_work function is called immediately and any errors it raises are immediately visible. The docs show how Task.Supervisor.async_nolink/3 might get used inside of a GenServer… I can get that example working, but it still doesn’t ensure that the risky_work ever completes. I can see where I can restart the task – there’s even a comment in the example # Log and possibly restart the task..., but if I am restarting the task, I feel like I’m doing something wrong. Isn’t that what the supervisor is supposed to do?

Thanks for any clarifications! I feel like maybe I’m thinking about this the wrong way. :thinking:

Most Liked

al2o3cr

al2o3cr

The way that an await-able Task gets its arguments isn’t compatible with being restarted by a standard Supervisor - the Task process is started up, and then the MFA and alias to use are sent to it:

So “restarting” the task process will leave it waiting for that initial tuple message forever.

This is obliquely referenced in the documentation for Task.Supervisor.async_nolink/3:

Note this function requires the task supervisor to have :temporary as the :restart option (the default), as async_nolink/3 keeps a direct reference to the task which is lost if the task is restarted.

Where Next?

Popular in Questions Top

yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
New
dokuzbir
Hello, I am trying to convert my lists to string without losing brackets.For start i have 3 map. They look like these buyer = %{ id: ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
Exadra37
Sometimes I want to check if the input into a function is not a blank string. My first approach: defmodule Example do def do_stuff(s...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

Other popular topics Top

JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1140 51847 244
New
yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list....
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement