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

freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
sabri
Can someone explain the settings of pool_size of Ecto in config file? and what is the recommend size? Thanks
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

freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
shahryarjb
Hello, I get Persian date from my client and convert it to normal calendar like this: def jalali_string_to_miladi_english_number(persi...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
William
I would like to know that is there any online source for learning Phoenix Framework for building E-Commerce Store? Any advantage on build...
New
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> someth...
New

We're in Beta

About us Mission Statement