Raku의 allof — 여러 Promise가 전부 끝날 때까지 기다리기

Raku의 allof — 여러 Promise가 전부 끝날 때까지 기다리기

스레드 몇 개를 각자 작업시키고, 그 전부가 끝났을 때 진행하고 싶을 때가 있어요. Promise.allof는 인자로 받은 모든 Promise가 끝나면 keep되는 새 Promise를 돌려주는 루틴이에요.

출처: Raku 공식 문서 — routine allof

시그니처

method allof(Promise:U: *@promises --> Promise:D)

인자로 넘긴 모든 Promise가 keep되든 broken되든 어떤 방식으로든 완료되면 keep되는 새 Promise를 돌려줘요.

개별 결과는 직접 확인해야 해

주의할 점이 있어요. allof가 돌려준 Promise의 결과에는 각 Promise의 개별 결과가 담기지 않아요. 그저 '전부 끝났다'는 신호일 뿐이에요. 개별 결과가 중요하다면 allof Promise가 keep된 뒤에 각 Promise의 result를 직접 확인해야 해요.

my @promises;
for 1..5 -> $t {
    push @promises, start {
        sleep $t;
    };
}
my $all-done = Promise.allof(@promises);
await $all-done;
@promises>>.result;
say "Promises kept so we get to live another day!";

여기서 @promises>>.result처럼 각각의 result를 부르는 이유가 그래요. 만약 그중 하나라도 broken된 Promise라면, 그 result를 요청하는 순간 원래의 Exception이 다시 던져져요. (예외를 보려면 여러 번 실행해야 할 수도 있어요.)