1

次のコード スニペットを検討してください。

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) を使用すると、プログラムが HTTPoison POST 要求中にハングするかのように、"test5" に到達しません。それは決して終わらない。一方、スニペット b) では、HTTPoison POST リクエストは遅延なく正常に完了します。

正直なところ、これをデバッグするのに時間がかかりましたが、まだスニペット a) の問題を理解していません。Task モジュールを誤用していませんか? ドキュメントを確認しましたが、この問題を説明するものは見つかりませんでした。

編集: スニペットの出力 a)

test1
test2
test3
4

1 に答える 1

2

HTTP リクエストのタイムアウト値が高いことがわかります。タスクのデフォルトのタイムアウト値は5_000 msであるため、リクエストが完了する前にタスクがタイムアウトする可能性が非常に高くなります。その後、タスクは強制終了され、出力は表示されません。このTask.await/2関数は、2 番目の引数としてタイムアウトを受け入れます。

それにもかかわらず、タスク タイムアウト エラーが表示されるはずです。おそらく、いくつかの出力を無視していますか?

于 2016-11-06T14:28:45.327 に答える