Raku의 allof — 여러 Promise가 전부 끝날 때까지 기다리기
Raku의 allof — 여러 Promise가 전부 끝날 때까지 기다리기
스레드 몇 개를 각자 작업시키고, 그 전부가 끝났을 때 진행하고 싶을 때가 있어요. Promise.allof는 인자로 받은 모든 Promise가 끝나면 keep되는 새 Promise를 돌려주는 루틴이에요.
시그니처
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이 다시 던져져요. (예외를 보려면 여러 번 실행해야 할 수도 있어요.)