Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous Task.await超时,导致GenServer终止_Asynchronous_Elixir_Gen Server - Fatal编程技术网

Asynchronous Task.await超时,导致GenServer终止

Asynchronous Task.await超时,导致GenServer终止,asynchronous,elixir,gen-server,Asynchronous,Elixir,Gen Server,我的Genserver在发送了一些http请求后不久终止。我不明白原因: [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/ta

我的Genserver在发送了一些http请求后不久终止。我不明白原因:

[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"}]
“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.

正如文档所述,
Task.await
有一个默认的超时时间5秒,在此时间之后退出(终止)调用进程。您可以按如下方式增加超时:

Task.await(task, 60000) # 1 minute
通过将
:infinity
作为超时而不是数字传递,可以完全删除超时:

Task.await(task, :infinity)

正如文档所述,
Task.await
有一个默认的超时时间5秒,在此时间之后退出(终止)调用进程。您可以按如下方式增加超时:

Task.await(task, 60000) # 1 minute
通过将
:infinity
作为超时而不是数字传递,可以完全删除超时:

Task.await(task, :infinity)

如果我只想不犯错误?也就是说,它会无声地发生吗?尝试在任务内部捕获。等待?我想你想要
task.yield/2
然后,它接受一个超时并在超时发生时返回
nil
,而不是抛出一个错误,并在成功时返回
{:ok,value}
默认超时时间为5秒,之后它抛出一个错误
--它在哪里说“error”在文档中?你是对的,它存在,而不是抛出错误。最好使用
Task.yield/2
然后,如果您想要超时,但希望处理超时,而不是退出当前进程。但是有什么区别?为什么更好?考虑到我可能不想处理超时。那么为什么我的代码会抛出错误呢?如果我只想不抛出错误呢?也就是说,它会无声地发生吗?尝试在任务内部捕获。等待?我想你想要
task.yield/2
然后,它接受一个超时并在超时发生时返回
nil
,而不是抛出一个错误,并在成功时返回
{:ok,value}
默认超时时间为5秒,之后它抛出一个错误
--它在哪里说“error”在文档中?你是对的,它存在,而不是抛出错误。最好使用
Task.yield/2
然后,如果您想要超时,但希望处理超时,而不是退出当前进程。但是有什么区别?为什么更好?考虑到我可能不想处理超时。那么为什么我的代码会抛出错误呢?