因为Task.async()
链接到当前进程,这是否意味着如果我在控制器的动作中使用它,一旦执行了动作,它会自动杀死,或者会死?
defmodule MyAppWeb.PageController do
use MyAppWeb, :controller
def index(conn, _params) do
# ????
Task.async(fn -> some_10_second_long_stuff() end)
Task.async(fn -> another_10_second_long_stuff() end)
# will they both get killed or die?
render(conn, "index.html")
end
如果是这样,应该改用什么?Task.start()
?
的唯一目的Task.async/1
是创建一个可以轻松等待的任务。
除非被炸毁或被杀死(阅读:如果它正常返回),它只会默默地死去,而且它肯定不会对调用进程做任何事情。如果任务异常死亡,也会导致调用进程崩溃。
我在上面链接的文档中对此进行了很好的描述。
也就是说,如果您只想为副作用生成任务,请使用Task.start/1
. 如果要监视任务并重新启动,如果崩溃,请使用Task.start_link/1
. 如果您需要控制器进程等待任务,请使用Task.async/1
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句