在Task.async中包装函数调用会导致我不理解的奇怪行为

时间:2016-11-06 13:50:15

标签: elixir httpoison

请考虑以下代码段:

A)

IO.puts "test1"
task = Task.async fn ->
  Foo.Bar.send_file_for_processing(file_url)
end
IO.puts "test2"
content = Task.await(task)
IO.puts "test4"

b)中

IO.puts "test1"
content = Foo.Bar.send_file_for_processing(file_url)
IO.puts "test2"

并在Foo.Bar模块中:

def send_file_for_processing(file_url) do
  json = file_url |> encoded_file |> request_json
  IO.puts "test3"
  request = HTTPoison.post(
    @processing_endpoint,
    json,
    @headers,
    params: %{"key": @api_key}, connect_timeout: 100000, recv_timeout: 100000, timeout: 100000
  )
  IO.puts "test5"

  (...)
end

当我使用代码片段a)时,永远不会达到“test5”,好像程序会在HTTPoison POST请求期间挂起。它永远不会完成。同时,使用代码段b),HTTPoison POST请求正常完成且没有任何延迟。

老实说,调试这个让我失去了一些时间,我仍然不理解代码片段的问题a)。我是否滥用了Task模块?我检查了文档,找不到任何可以解释这个问题的内容。

编辑: 代码段输出a)

test1
test2
test3

1 个答案:

答案 0 :(得分:1)

我可以看到HTTP请求的超时值很高。该任务的默认超时值为5_000 ms,因此请求完成之前的任务超时很可能。随后任务被杀死,你永远不会看到输出。 Task.await/2函数接受超时作为第二个参数。

无论如何,您应该看到任务超时错误。也许你忽略了一些输出?