Codename-404

Codename-404

Elixir function doesn't continue if takes too long

def func do
convert_video.(1280)
IO.puts(“Conversion done, starting to upload”)
end

I have this function, but problem is, if convert_video.(1280) takes too long, IO.puts(“Conversion done, starting to upload”) line does not execute, infact nothing after executes.
However if convert_video.(1280) takes short time, all the codes below executes.

How to make sure function always executes fully?

Marked As Solved

lud

lud

Also what you can do is register your process to give it a name:

def func do
  Process.register(self(), :hello)
  convert_video.(1280)
  IO.puts("Conversion done, starting to upload")
end

Then start your app with iex (like iex -S mix phx.server if using Phoenix) and run a single long conversion (otherwise process registration will clash), and once you see in the OS that it is finished, you can call this in IEx:

pid = Process.whereis(:hello)

This will return a pid, or nil. If it returns nil it means that your function either crashed silently, for some reason, or completed but you could not see the output of IO.puts for some reason (but it was executed as Robert says).

If you get a pid, then your process is still awaiting something, or looping forever somewhere. You can then call this in IEx shell:

Process.info(pid, :current_stacktrace)

This will show what is that process doing at the moment.

For instance if for some reason the process is still awaiting a return from a system command, you may see this:

iex(7)> pid = spawn(fn -> System.cmd("watch", ["sleep", "1000"]) end)
#PID<0.116.0>
iex(8)> Process.info(pid, :current_stacktrace)
{:current_stacktrace,
 [
   {System, :do_port_byte, 3, [file: ~c"lib/system.ex", line: 1118]},
   {System, :do_cmd, 3, [file: ~c"lib/system.ex", line: 1107]},
   {:elixir, :eval_external_handler, 3, [file: ~c"src/elixir.erl", line: 396]}
 ]}

Also Liked

rvirding

rvirding

Creator of Erlang

A function always executes until it is completed.

Codename-404

Codename-404

That was really helpful, Thank you very much ~
So, I found out, the process was returing nil after a while, then I realized it was the phoenix timeout after 60 seconds by default.
So I increased the default timeout behaviour, and now it works. Alhamdulillah ~
Thanks again, May Allah return the favour upon you in a greater way ~

dimitarvp

dimitarvp

Consider marking @lud’s answer as the solution. It helps future readers.

Last Post!

dimitarvp

dimitarvp

Consider marking @lud’s answer as the solution. It helps future readers.

Where Next?

Popular in Questions Top

vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
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

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
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
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New

We're in Beta

About us Mission Statement