2017-06-13 5 views
0

My Genserverは、httpリクエストを送信してからしばらくして終了します。私はその理由を理解することはできません。Task.waitタイムアウトにより、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. 

答えて

2

をドキュメントが言うように、Task.awaitは、それが終了した後5秒(終了)呼び出し元プロセスのデフォルトのタイムアウトを持っています。

Task.await(task, 60000) # 1 minute 

を、あなたはタイムアウトの代わりの数として:infinityを渡すことで、完全にタイムアウトを削除することができます:あなたはこのようにタイムアウトを増やすことができ

Task.await(task, :infinity) 
+0

と私はエラーをスローしないようにしたい場合は?すなわち、それは静かに起こるでしょうか?試してみてください。 – Jodimoro

+0

私はあなたが 'Task.yield/2'を望んでいると思います。これはタイムアウトを受け取り、エラーを投げる代わりにタイムアウトが発生した場合は' nil'を返し、成功すると '{ok、value}'を返します。 – Dogbert

+0

'デフォルトタイムアウト5秒後にエラーが発生する' - ドキュメンテーションで「エラー」とはどこですか? – Jodimoro

関連する問題