Как работает Elixir Enum.map([Task.t], &Task.await)
?Как работает Enum.map с Task.await?
async_1 = Task.async(fn ->
IO.inspect("done async 1")
1
end)
async_2 = Task.async(fn ->
IO.inspect("done async 2")
2
end)
results = Enum.map([async_1, async_2], fn(task) ->
IO.inspect("starting new task")
IO.inspect(task)
Task.await(task)
end)
IO.inspect(results)
Из кода выше, я получил журнал IO:
"starting new task"
"done async 1"
"done async 2"
%Task{pid: #PID<0.51.0>, ref: #Reference<0.0.0.78>}
"starting new task"
%Task{pid: #PID<0.52.0>, ref: #Reference<0.0.0.79>}
[1, 2]
- Я бы ожидать, что второй
"starting new task"
показал перед"done async 2"
сделал. Как он выполнял все асинхронные задачи с нетерпением? - От doc он говорит, что
await
будет «Ожидает ответ задачи и возвращает его». Я предположил, что это означает, что он приостановит процесс вызова, пока сообщение завершения не будет отправлено обратно из процессаTask
. Если это так, он должен приостановить на каждом вызовеTask.await(Task.t)
в каждой итерацииmap
и никогда не выполнять эти задачи одновременно. Журнал доказал, что мое предположение неверно. Но где это неправильно?
Вот мой РЕПЛ http://elixirplayground.com?gist=f1fa90eadc00441a360d8bc883d64529