상호 독립적인 표현식을 동시 실행하고 그 결과를 명명된 단일 레코드로 반환받고자 할 때 concurrent를 사용합니다. 일반적인 애플리케이션 코드에서는 실행 시간과 시간 초과 대체 값을 명시하세요.
제한 시간 안에 완료하기
다음 코드를 concurrency-success.tpz로 저장합니다.
let 결과 = concurrent(timeout: 3s) {
합계: 1 + 2
상태: "ready"
} else {
{ 합계: -1, 상태: "timeout" }
}
print("{결과.합계} {결과.상태}")검사한 뒤 실행합니다.
topaz check concurrency-success.tpz
topaz run concurrency-success.tpz두 작업 모두 지정된 제한 시간 내에 완료됩니다. 이에 따라 각 작업명이 결과 레코드의 필드로 매핑됩니다.
3 ready레코드는 작업 이름과 처리 결과를 매핑합니다. 어떤 작업이 먼저 시작되었거나 종료되었는지는 반환된 결과에서 파악할 수 없습니다.
시간 초과 시 대체 값 선택하기
두 번째 프로그램에는 종료되지 않는 작업이 포함되어 있습니다. 다음 코드를 concurrency-timeout.tpz로 저장합니다.
function 회전() -> int {
let mut 번호 = 0
while true { 번호 += 1 }
번호
}
let 결과 = concurrent(timeout: 5ms) {
멈춤: 회전()
} else {
{ 멈춤: -1 }
}
print("{결과.멈춤}")검사한 뒤 실행합니다.
topaz check concurrency-timeout.tpz
topaz run concurrency-timeout.tpz제한 시간이 먼저 만료되면 아직 완료되지 않은 작업의 결과는 반환되지 않습니다. 이 경우 else 블록이 전체 결과를 생성합니다.
-1세 가지 결과 구분하기
| 제한 시간 도래 전 이벤트 | 표현식의 반환 결과 |
|---|---|
| 모든 작업이 완료됨 | 각 작업당 하나의 필드를 포함하는 레코드 |
| 제한 시간이 먼저 만료됨 | else 블록에서 반환된 값 |
| 단일 작업에서 실행 오류 발생 | 전체 표현식이 실행 오류로 종료되며 else 블록은 실행되지 않음 |
작업이 Err(error)를 반환하더라도 이는 실행 오류로 취급되지 않습니다. 해당 Result는 명명된 레코드 필드에 격납되는 일반적인 값입니다. 대체 값은 성공한 작업 레코드의 타입과 호환되어야 합니다. 따라서 두 예제의 성공 경로와 else 경로는 동일한 필드명을 사용하며 값의 타입 역시 상호 일치하도록 구성됩니다.
결과 이름과 스케줄링
작업 이름은 결과를 레코드 필드에 연결합니다. 스케줄러의 시작 순서, 완료 순서, 출력 인터리빙, 공정성, 결정론적 인터리빙은 지정되어 있지 않습니다. 출력 순서가 중요하다면 먼저 작업을 합류한 뒤 레코드를 출력하세요.
시간 초과 뒤의 취소와 리소스 정리는 런타임 정책이 처리합니다. 중단된 작업에서 나중에 발생한 실행 오류는 토파즈 표현식으로 전달되지 않습니다. 코드는 스케줄러 선택과 시간 초과 이후의 세부 정리 방식에 의존하지 않아야 합니다.
흔한 수정
3s나5ms처럼 수치와 단위를 붙여 작성합니다..seconds같은 속성 형식은 시간 리터럴로 다뤄지지 않습니다.- 동시성 제한 시간은 밀리초 단위로 환산했을 때 부호 없는
u64범위(0..=18446744073709551615)에 맞아야 합니다. 정확한 최대값은18446744073709551615ms,18446744073709551s,307445734561825m이며, 이를 초과하는 값은TPZ5001오류로 거절됩니다. - 제한 시간을 지정하는 경우
else블록을 명시해야 합니다. 제한 시간 없이 합류만 수행할 때는else블록을 사용할 수 없습니다. else블록은 시간 초과 상황만 처리합니다. 실행 오류를 포착하거나Err를 언래핑하지 않습니다.- 작업 이름은 중복 지정할 수 없습니다. 결과의 일부만 추출하는 별도의 문법은 제공되지 않습니다.
제한 시간이 없는 concurrent { ... } 합류 구문은 대기 동작 자체가 핵심 설명 대상인 고급 동시성 문서에서 활용할 수 있습니다. 이는 일반적인 예제에서 사용하는 기본 형식은 아닙니다.
암묵적인 비동기 모델, async/await 문법, 공개 작업 핸들, 일반적인 시간 연산, 명시적 취소 프로토콜은 지원하지 않습니다. 관찰 가능한 실행 오류 및 순서의 경계 조건은 런타임 동작에서 확인하세요. 익숙해 보이지만 지원되지 않는 구문 형식은 금지·유예 형식에서 확인하세요.