Perl 6 中的 "await do" 是什么?
What is "await do" in Perl 6?
我在 Perl 6 中看到以下代码:
await do for @files -> $file {
start {
#do something ... }
}
以异步模式运行。
为什么上面的代码需要do
? do
在 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 if
、do 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 任务的便捷功能。您必须始终遵守承诺。
我在 Perl 6 中看到以下代码:
await do for @files -> $file {
start {
#do something ... }
}
以异步模式运行。
为什么上面的代码需要do
? do
在 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 if
、do 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 任务的便捷功能。您必须始终遵守承诺。