Обращение функции вызова в Task.async вызывает странное поведение, которое я не понимаю
Рассмотрим следующие фрагменты кода:
а)
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"
б)
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 завершается нормально и без каких-либо задержек.
Честно говоря, отладка этого заставила меня потерять некоторое время, и я до сих пор не понимаю проблемы со сниппетом а). Я неправильно использую модуль Task? Я проверил документацию и не смог найти ничего, что объяснило бы мне эту проблему.
РЕДАКТИРОВАТЬ: выход для фрагмента а)
test1
test2
test3
1 ответ
Я вижу, у вас есть высокие значения времени ожидания для HTTP-запроса. Задание по умолчанию имеет значение времени ожидания 5_000 ms
, поэтому вполне возможно, что тайм-ауты задачи до завершения запроса. Впоследствии задача будет убита, и вы никогда не увидите результат. Task.await/2
функция принимает тайм-аут в качестве второго аргумента.
Независимо от этого вы должны увидеть ошибки тайм-аута задачи. Возможно, вы игнорируете какой-то вывод?