我在Perl 6中看到了以下代码:
await do for @files -> $file {
start {
#do something ... }
}在异步模式下运行。为什么上面的代码需要do?Perl 6中的do的目的是什么?有谁能详细解释一下上面的代码吗?
还有一个选项是这样写的:
for @files -> $file {
start {
#do something ... }
}然后等着代码才能兑现承诺?
发布于 2016-11-23 12:11:59
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 ... }
}...does如下:
@files上循环。start关键字来调度一个异步任务,该任务可能对当前元素$file执行一些操作。( $*SCHEDULER变量决定任务的实际启动方式;默认情况下,它使用一个简单的线程池调度程序。)start的调用都会立即返回一个Promise,该Promise将在异步任务完成后进行更新。do for收集循环体的所有返回值(即承诺)的序列。await函数接受这个序列作为它的参数,并等待直到所有的承诺完成。如何“等待代码”
我不太明白你在这里的意思。如果您想记住这些承诺,而不是等待它们,只需将它们存储在一个数组中:
my @promises = do for @files -> $file {
start {
#do something ... }
}
#other code ...
await @promises;对于等待所有计划/运行的任务,没有方便的功能。你总是要记住承诺。
https://stackoverflow.com/questions/40761460
复制相似问题