Raku의 await — 채널이나 프로미스가 끝나기를 기다리기
Raku의 await — 채널이나 프로미스가 끝나기를 기다리기
비동기 작업에서 어떤 값이 준비될 때까지 기다려야 할 때가 있어요. await는 하나 이상의 Channel이나 Promise가 값을 준비할 때까지 기다렸다가 그 값들을 돌려줘요. 채널에는 .receive를 호출하는 셈이고, 프로미스에도 그대로 동작해요.
본문
In Channel
multi await(Channel:D)
multi await(*@)
하나 이상의 채널이 모두 값을 가질 때까지 기다렸다가 그 값들을 돌려줘요(채널에 .receive를 호출해요). 프로미스에도 동작하고요.
my $c = Channel.new;
Promise.in(1).then({$c.send(1)});
say await $c;
한 가지 기억할 점이 있어요. 6.d부터 await는 기다리는 동안 스레드를 막지(block) 않아요. 비동기 환경에서 다른 작업이 진행되는 걸 방해하지 않는다는 뜻이에요.
In Promise
multi await(Promise:D --> Promise)
multi await(*@ --> Array)
하나 이상의 프로미스가 모두 fulfilled(성공)될 때까지 기다렸다가 그 값들을 돌려줘요. 채널에도 동작하고요. 프로미스가 broken(실패) 상태라면 해당 예외를 다시 던져요. 리스트를 넘기면 각 항목을 차례로 기다린 결과를 리스트로 돌려주게 돼요.