Обращение функции вызова в 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 функция принимает тайм-аут в качестве второго аргумента.

Независимо от этого вы должны увидеть ошибки тайм-аута задачи. Возможно, вы игнорируете какой-то вывод?

Другие вопросы по тегам