Perl 6中的“等待做什么”是什么?

问题描述 投票:10回答:1

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

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

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

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

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

并等待承诺履行的代码?

perl6 raku
1个回答
9
投票

The purpose of do

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

1)作为独立的块声明:

for 1..5 { say $_ }

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

say $_ for 1..5;

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

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

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


Explanation of your code

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

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

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

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

How to "await after the code"

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

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

#other code ...

await @promises;

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

© www.soinside.com 2019 - 2024. All rights reserved.