Asynchronous Enum.map如何与Task.await一起工作?

Asynchronous Enum.map如何与Task.await一起工作?,asynchronous,concurrency,async-await,elixir,Asynchronous,Concurrency,Async Await,Elixir,Elixir Enum.map[Task.t]、&Task.await是如何工作的 根据上面的代码,我得到了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.

Elixir Enum.map[Task.t]、&Task.await是如何工作的

根据上面的代码,我得到了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]
我希望第二个新任务在Async2完成之前出现。它是如何急切地执行所有异步任务的? 从中,它表示等待将等待任务答复并返回。我假设这意味着它将暂停调用者进程,直到任务进程返回一条完成消息。如果是这种情况,它应该在每次映射迭代中调用Task.awaitTask.t时暂停,并且永远不会同时执行这些任务。日志证明了我的假设是错误的。但哪里错了呢?
这是我的repl

Task.async不会等到Task.wait运行传递给它的函数;它立即开始运行它。此处分配给任务的工作量非常小,因此当Enum.map有机会等待第二个任务时,这两个任务都已完成执行。

task.async不会等到task.wait运行传递给它的函数;它立即开始运行它。这里分配给任务的工作量非常小,因此当Enum.map有机会等待第二个任务时,这两个任务都已经完成了执行。

感谢@Dogbert的启示。我误解了Elixir中的Task.async

这让我很困惑,因为在ES7和C中,async只是一个关键字,指示函数将返回承诺或异步。async仅负责定义async_函数。等待做两件事——执行和等待结果。i、 e

function async(action: fn): Promise
function await(async_action: Promise): ?Any { execute_and_wait(async_function) } 
在Elixir中,Task.async将在一个新进程中执行该函数,这类似于start\u link。而wait只等待正在执行的进程返回结果


不是说设计不合理。但我更希望他们称它为异步以外的东西,因为它打破了其他通用语言的惯例,因此更难学习感谢@Dogbert的启示。我误解了Elixir中的Task.async

这让我很困惑,因为在ES7和C中,async只是一个关键字,指示函数将返回承诺或异步。async仅负责定义async_函数。等待做两件事——执行和等待结果。i、 e

function async(action: fn): Promise
function await(async_action: Promise): ?Any { execute_and_wait(async_function) } 
在Elixir中,Task.async将在一个新进程中执行该函数,这类似于start\u link。而wait只等待正在执行的进程返回结果

不是说设计不合理。但我更希望他们称它为异步以外的东西,因为它打破了其他通用语言的惯例,因此更难学习