Perl 6 中的 "await do" 是什么?

What is "await do" in Perl 6?

我在 Perl 6 中看到以下代码:

await do for @files -> $file {
    start {
       #do something ...    }
}

以异步模式运行。 为什么上面的代码需要dodo 在 Perl 6 中的用途是什么?有人可以详细解释一下上面的代码吗?

还有一个选项可以这样写:

for @files -> $file {
    start {
       #do something ...    }
}

并等待兑现承诺的代码?

目的do

for关键字有两种不同的用法:

1) 作为一个独立的块语句:

for 1..5 { say $_ }

2) 作为附加在语句末尾的语句修饰符:

say $_ for 1..5;

当在较大的语句中间遇到裸 for 关键字时,它被解释为第二种形式。

如果你想在一个更大的语句中使用块形式(例如作为 await 函数的参数),你必须在它前面加上 do 来告诉解析器你'在这里重新开始一个块语句,并想要它的 return 值。

更一般地说,do 确保它后面的内容使用相同的规则进行解析,就好像它是自己的语句一样,并使其提供 return 值。因此,它允许我们将任何语句用作更大语句中的表达式。 do ifdo while 等都以相同的方式工作。


代码说明

您显示的代码...

await do for @files -> $file {
    start {
       #do somthing ...    }
}

...执行以下操作:

  • 它在数组 @files 上循环。
  • 对于每次迭代,它使用 start 关键字来安排一个异步任务,该任务可能会对当前元素 $file 执行某些操作。 $*SCHEDULER 变量决定任务的实际启动方式;默认情况下它使用简单的线程池调度程序。)
  • start 的每次调用都会立即 return 生成一个 Promise,它将在异步任务完成后更新。
  • do for 收集循环体(即承诺)的所有 return 值的序列。
  • await 函数接受此序列作为其参数,并等待所有承诺完成。

如何"await after the code"

不完全确定你在这里的意思。 如果你想记住 promises 而不是等待它们只是 jet,只需将它们存储在一个数组中:

my @promises = do for @files -> $file {
    start {
       #do something ...    }
}

#other code ...

await @promises;

没有等待所有 scheduled/running 任务的便捷功能。您必须始终遵守承诺。