我在Perl 6中看到以下代码:
await do for @files -> $file {
start {
#do something ... }
}
它以异步模式运行。为什么上面的代码需要do
?在Perl 6中do
的目的是什么?有人可以详细解释上面的代码吗?
还有一个选项可以写这样的东西:
for @files -> $file {
start {
#do something ... }
}
并等待承诺履行的代码?
do
for
关键字可以以两种不同的方式使用:
1)作为独立的块声明:
for 1..5 { say $_ }
2)作为附加到语句末尾的语句修饰符:
say $_ for 1..5;
当在较大的语句中遇到裸for
关键字时,它被解释为第二种形式。
如果你想在一个更大的语句中使用块形式(例如作为await
函数的参数),你必须在它前面添加do
来告诉解析器你在这里开始一个块语句,并希望它的返回值。
更一般地说,do
确保使用相同的规则解析它后面的内容,就好像它是自己的语句一样,并使它提供返回值。因此,它允许我们将任何语句用作更大语句中的表达式。 do if
,do while
等都以同样的方式工作。
你展示的代码......
await do for @files -> $file {
start {
#do somthing ... }
}
......执行以下操作:
@files
上循环。start
关键字来安排异步任务,这可能与当前元素$file
有关。 ($*SCHEDULER
变量决定了任务的实际启动方式;默认情况下,它使用简单的线程池调度程序。)start
都会立即返回一个Promise
,它将在异步任务完成时更新。do for
收集循环体的所有返回值的序列(即承诺)。await
函数接受此序列作为其参数,并等待所有承诺完成。不完全确定你的意思。如果你想记住承诺但不等待它们只是喷射,只需将它们存储在一个数组中:
my @promises = do for @files -> $file {
start {
#do something ... }
}
#other code ...
await @promises;
等待所有预定/运行任务没有便利功能。你总是要跟踪承诺。