Task.async 中的包装函数调用导致我不明白的奇怪行为
Wrapping function call in Task.async causes weird behaviour that I do not understand
考虑以下代码片段:
一)
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) 的问题。我在滥用任务模块吗?我已经检查了文档,但找不到任何可以向我解释这个问题的内容。
编辑:
片段 a)
的输出
test1
test2
test3
我看到您的 HTTP 请求超时值很高。该任务的默认超时值为 5_000 ms
,因此任务很可能在请求完成之前超时。随后任务被杀死,你永远看不到输出。 Task.await/2
函数接受超时作为第二个参数。
无论如何,您应该会看到任务超时错误。也许您忽略了一些输出?
考虑以下代码片段:
一)
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) 的问题。我在滥用任务模块吗?我已经检查了文档,但找不到任何可以向我解释这个问题的内容。
编辑: 片段 a)
的输出test1
test2
test3
我看到您的 HTTP 请求超时值很高。该任务的默认超时值为 5_000 ms
,因此任务很可能在请求完成之前超时。随后任务被杀死,你永远看不到输出。 Task.await/2
函数接受超时作为第二个参数。
无论如何,您应该会看到任务超时错误。也许您忽略了一些输出?