【问题标题】:Task.await timeout which is causing GenServer to terminateTask.await 超时导致 GenServer 终止
【发布时间】:2017-11-14 17:13:01
【问题描述】:

在发送了几个 http 请求后,我的 Genserver 会在一段时间后终止。我无法理解原因:

[error] GenServer MyGenServer terminating
** (stop) exited in: Task.await(%Task{owner: #PID<0.420.0>, pid: #PID<0.1054.0>, ref: #Reference<....>}, 5000)
    ** (EXIT) time out
    (elixir) lib/task.ex:416: Task.await/2
    (elixir) lib/enum.ex:966: Enum.flat_map_list/2
    (my_app123) lib/my_genserver.ex:260: MyApp.MyGenServer.do_work/1
    (my_app123) lib/my_genserver.ex:180: MyApp.MyGenServer.handle_info/2
    (stdlib) gen_server.erl:601: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:683: :gen_server.handle_msg/5
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Last message: :tick
State: [%{var1: "fdsafdsfd", var2: "43243242"}]

一段代码:

  # it's called from handle_info

  def do_work(some_data) do
    Enum.map(some_data, fn(x) ->
      Task.async(fn ->
        case HTTPoison.post(.....) do
        # ...........

“Task.async”是否导致超时?但为什么?是的,它可能需要超过 5 秒才能完成,但为什么它会导致异常然后终止 GenServer?如何解决?

关于等待:

If the timeout is exceeded, await will exit; however, the task will continue to run. When the calling process exits, its exit signal will terminate the task if it is not trapping exits.

【问题讨论】:

    标签: asynchronous elixir gen-server


    【解决方案1】:

    正如文档所述,Task.await 的默认超时时间为 5 秒,之后它退出(终止)调用进程。您可以像这样增加超时时间:

    Task.await(task, 60000) # 1 minute
    

    您可以通过将:infinity 作为超时而不是数字来完全消除超时:

    Task.await(task, :infinity)
    

    【讨论】:

    • 如果我只想不抛出错误?也就是说,它会悄无声息地发生吗?尝试...在 task.await 中捕获?
    • 我想你想要Task.yield/2 then,它接受超时并在超时发生时返回nil,而不是抛出错误并在成功时返回{:ok, value}
    • default timeout of 5 seconds after which it throws an error -- 在文档中哪里说“错误”?
    • 你是对的,它退出,而不是抛出错误。最好使用Task.yield/2,然后如果您想要超时但您想处理超时而不是退出当前进程。
    • 但是有什么区别呢?为什么更好?鉴于我可能不想处理超时。那为什么我的代码会抛出错误呢?
    猜你喜欢
    • 2018-12-24
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多