프로그램 구조

동시성

명명된 작업을 제한 시간 내에 실행하여 성공·시간 초과·Result·실행 오류를 구분합니다.

상호 독립적인 표현식을 동시 실행하고 그 결과를 명명된 단일 레코드로 반환받고자 할 때 concurrent를 사용합니다. 일반적인 애플리케이션 코드에서는 대체 값을 명시적으로 지정한 제한 시간 구성을 선택하세요.

제한 시간 안에 완료하기

다음 코드를 concurrency-success.tpz로 저장합니다.

TOPAZ
let 결과 = concurrent(timeout: 3s) {
    합계: 1 + 2
    상태: "ready"
} else {
    { 합계: -1, 상태: "timeout" }
}

print("{결과.합계} {결과.상태}")

검사한 뒤 실행합니다.

BASH
topaz check concurrency-success.tpz
topaz run concurrency-success.tpz

두 작업 모두 지정된 제한 시간 내에 완료됩니다. 이에 따라 각 작업명이 결과 레코드의 필드로 매핑됩니다.

출력
3 ready

레코드는 작업 이름과 처리 결과를 매핑합니다. 어떤 작업이 먼저 시작되었거나 종료되었는지는 반환된 결과에서 파악할 수 없습니다.

시간 초과 시 대체 값 선택하기

두 번째 프로그램에는 종료되지 않는 작업이 포함되어 있습니다. 다음 코드를 concurrency-timeout.tpz로 저장합니다.

TOPAZ
function 회전() -> int {
    let mut 번호 = 0
    while true { 번호 += 1 }
    번호
}

let 결과 = concurrent(timeout: 5ms) {
    멈춤: 회전()
} else {
    { 멈춤: -1 }
}

print("{결과.멈춤}")

검사한 뒤 실행합니다.

BASH
topaz check concurrency-timeout.tpz
topaz run concurrency-timeout.tpz

제한 시간이 먼저 만료되면 아직 완료되지 않은 작업의 결과는 반환되지 않습니다. 이 경우 else 블록이 전체 결과를 생성합니다.

출력
-1

세 가지 결과 구분하기

제한 시간 도래 전 이벤트표현식의 반환 결과
모든 작업이 완료됨각 작업당 하나의 필드를 포함하는 레코드
제한 시간이 먼저 만료됨else 블록에서 반환된 값
단일 작업에서 실행 오류 발생전체 표현식이 실행 오류로 종료되며 else 블록은 실행되지 않음

작업이 Err(error)를 반환하더라도 이는 실행 오류로 취급되지 않습니다. 해당 Result는 명명된 레코드 필드에 격납되는 일반적인 값입니다. 대체 값은 성공한 작업 레코드의 타입과 호환되어야 합니다. 따라서 두 예제의 성공 경로와 else 경로는 동일한 필드명을 사용하며 값의 타입 역시 상호 일치하도록 구성됩니다.

이름이 보장하지 않는 것

작업 이름은 결과와의 매핑만 고정할 뿐, 실행 순서까지 규정하지는 않습니다. 토파즈는 작업의 시작 순서, 완료 순서, 출력의 인터리빙 순서, 공정성, 결정론적 실행 순서를 보장하지 않습니다. 순서가 중요한 로직이라면 작업 내부에서 print를 호출하지 마세요. 예제와 같이 작업을 합류시킨 후 레코드를 출력하세요.

시간이 초과된 이후 남은 작업을 취소하고 정리하는 방식은 런타임 정책에 따라 결정됩니다. 취소된 작업에서 추후 실행 오류가 발생하더라도 토파즈 표현식은 이를 전달받지 못합니다. 따라서 특정 스케줄러의 동작을 전제하거나 시간 초과 이후의 정리 프로세스가 모든 환경에서 동일하다고 가정하면 안 됩니다.

흔한 수정

  • 3s5ms처럼 수치와 단위를 붙여 작성합니다. .seconds 같은 속성 형식은 시간 리터럴로 다뤄지지 않습니다.
  • 제한 시간을 지정하는 경우 else 블록을 명시해야 합니다. 제한 시간 없이 합류만 수행할 때는 else 블록을 사용할 수 없습니다.
  • else 블록은 시간 초과 상황만 처리합니다. 실행 오류를 포착하거나 Err를 언래핑하지 않습니다.
  • 작업 이름은 중복 지정할 수 없습니다. 결과의 일부만 추출하는 별도의 문법은 제공되지 않습니다.

제한 시간이 없는 concurrent { ... } 합류 구문은 대기 동작 자체가 핵심 설명 대상인 고급 동시성 문서에서 활용할 수 있습니다. 이는 일반적인 예제에서 사용하는 기본 형식은 아닙니다.

암묵적인 비동기 모델, async/await 문법, 공개 작업 핸들, 일반적인 시간 연산, 명시적 취소 프로토콜은 지원하지 않습니다. 관찰 가능한 실행 오류 및 순서의 경계 조건은 런타임 동작에서 확인하세요. 익숙해 보이지만 지원되지 않는 구문 형식은 금지·유예 형식에서 확인하세요.