【发布时间】:2017-02-21 05:17:41
【问题描述】:
Elixir Enum.map([Task.t], &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进程发回完成消息。如果是这种情况,它应该在每次map迭代中的每次调用Task.await(Task.t)时暂停,并且永远不会真正同时执行这些任务。日志证明我的假设是错误的。但哪里错了?
这是我的回复http://elixirplayground.com?gist=f1fa90eadc00441a360d8bc883d64529
【问题讨论】:
标签: asynchronous concurrency async-await elixir