Perl 6中的"等待做什么"是什么?

smi*_*ith 10 perl6 raku

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

await do for @files -> $file {
    start {
       #do something ...    }
}
Run Code Online (Sandbox Code Playgroud)

它以异步模式运行.为什么上面的代码需要dodoPerl 6 的目的是什么?有人可以详细解释上面的代码吗?

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

for @files -> $file {
    start {
       #do something ...    }
}
Run Code Online (Sandbox Code Playgroud)

并等待承诺履行的代码?

sml*_*mls 10

的目的 do

for关键字可以用两种不同的方式使用:

1)作为独立的块声明:

for 1..5 { say $_ }
Run Code Online (Sandbox Code Playgroud)

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

say $_ for 1..5;
Run Code Online (Sandbox Code Playgroud)

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

如果你想在一个更大的语句中使用块形式(例如作为await函数的参数),你必须在它前面do告诉解析器你在这里开始一个块语句,并希望它的返回值.

更一般地说,do确保使用相同的规则解析它后面的内容,就好像它是自己的语句一样,并使它提供返回值.因此,它允许我们将任何语句用作更大语句中的表达式.do if,do while等所有的工作方式相同.


你的代码的解释

你展示的代码......

await do for @files -> $file {
    start {
       #do somthing ...    }
}
Run Code Online (Sandbox Code Playgroud)

......执行以下操作:

  • 它循环遍历数组@files.
  • 对于每次迭代,它使用start关键字来调度异步任务,这可能与当前元素有关$file.($*SCHEDULER变量决定实际如何启动任务;默认情况下,它使用简单的线程池调度程序.)
  • 每次调用都会start立即返回一个Promise异步任务完成时将更新的内容.
  • do for收集的循环体(即承诺)的所有返回值的序列.
  • await函数接受此序列作为其参数,并等待所有promise完成.

如何"等待代码"

不完全确定你的意思.如果你想记住承诺但不等待它们只是喷射,只需将它们存储在一个数组中:

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

#other code ...

await @promises;
Run Code Online (Sandbox Code Playgroud)

等待所有预定/运行任务没有便利功能.你总是要跟踪承诺.