sync 표현식을 사용하여 둘 이상의 비동기화 표현식을 동시에 실행할 수 있습니다. 예를 들면 다음과 같습니다.
# 3개의 비동기화 함수가 모두 동시에 유효하게 시작합니다
Results = sync:
AsyncFunction1() # 작업 1
AsyncFunction2() # 작업 2
AsyncFunction3() # 작업 3
# 순서에 상관없이 3개의 작업이 모두 완료된 후에 호출됩니다.
MyLog.Print("Done with list of results: {Results}")
sync 표현식의 구문은 아래 코드와 같으며, 아래 그림에 표현식의 실행 흐름이 나타나 있습니다.
expression0
sync:
slow-expression
mid-expression
fast-expression
expression1
sync 표현식의 사용
sync 표현식을 사용할 수 있는 경우 |
비동기화 컨텍스트 |
sync 표현식의 호출 시간 |
비동기 |
sync 코드 블록의 요건 |
sync 표현식의 바디에는 적어도 둘 이상의 비동기화 표현식이 있어야 합니다. 둘 이상의 비동기화 표현식이 있지 않은 경우 표현식을 동시에 실행할 필요가 없습니다. |
sync 표현식의 역할 |
코드 블록 내 모든 표현식을 동시에 실행하고 모든 표현식이 완료될 때까지 기다린 후에 sync 다음의 표현식을 실행합니다. |
sync 표현식이 완료되는 시점 |
sync 코드 블록 내 모든 표현식이 완료되면 sync 가 완료됩니다. |
sync 이후 다음 표현식이 시작되는 시점 |
sync 코드 블록 내 모든 표현식이 완료되면 다음 표현식이 시작됩니다. |
sync 표현식의 결과 |
결과는 각 표현식의 결과를 최상위 표현식이 지정된 순서대로 나열한 튜플입니다. 표현식의 결과 타입은 어떤 타입이든 될 수 있으며, 각 튜플 엘리먼트는 해당하는 표현식의 타입을 갖습니다. |
적어도 둘 이상의 최상위 표현식이 비동기화 표현식이어야 합니다.
sync:
AsyncFunction1()
MyLog.Print("Second top level expression")
AsyncFunction2()
MyLog.Print("Third top level expression")
sync:
AsyncFunction1()
# 오류: 적어도 둘 이상의 최상위 표현식이 있어야 합니다.
최상위 표현식은 중첩된 코드 블록 같은 복합 표현식이 될 수도 있습니다.
# sync는 복합 표현식을 가질 수도 있습니다.
# 이 경우 각 최상위 표현식을 고유한 작업으로 가집니다.
sync:
block: # 작업 1
# 순차적으로 평가됩니다.
AsyncFunction1a()
AsyncFunction1b()
block: # 작업 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()
AsyncFunction3() # 작업 3
# AsyncFunction1a(), AsyncFunction2a(), AsyncFunction3() 모두 기본적으로 동시에 시작됩니다.
튜플은 자체적으로 스플랫하는 실행인자로 사용될 수 있으므로, 튜플을 결과로 가지는 sync 표현식은 직접 실행인자로 사용될 수 있습니다. 이를 통해 비동기화 실행인자가 동시에 평가되며, 실행인자가 전달되는 함수는 sync 코드 블록 내 모든 표현식이 완료된 후에 호출됩니다.
# 동시실행루틴 3개가 동시에 평가되기 시작합니다.
DoStuff(sync{AsyncFunctionArg1(); AsyncFunctionArg2(); AsyncFunctionArg3()})
# 모든 실행인자가 비동기화 실행인자일 필요는 없고, 최소 두 개가 비동기화여도 sync를 사용할 이유가 됩니다.
DoOtherStuff(sync{AsyncFunctionArg1(); 42; AsyncFunctionArg2(); AsyncFunctionArg3()})