독립적인 작업을 concurrent로 동시 실행하고, 이름이 붙은 레코드 필드로 결과를 모으세요. 제한 시간을 지정하고 else에 시간 초과 때 사용할 결과를 쓰세요.
첫 프로그램에서 토파즈를 설치하세요. 아래 프로그램을 각각 작업 폴더에 저장하고 그 폴더에서 명령을 실행하세요.
제한 시간 안에 완료하기
다음 코드를 concurrency-success.tpz로 저장하세요.
let 결과 = concurrent(timeout: 3s) {
합계: 1 + 2
상태: "ready"
} else {
{ 합계: -1, 상태: "timeout" }
}
print("{결과.합계} {결과.상태}")검사하고 실행하세요.
topaz check concurrency-success.tpz
topaz run concurrency-success.tpz두 명령 모두 종료 코드 0으로 끝납니다. 두 작업이 3초 안에 끝나면 결과 레코드의 값을 출력합니다.
3 readyconcurrent 안에서 이름을 붙인 각 표현식이 작업 하나입니다. 영어로는 arm이라고도 부릅니다. 여기서 합계는 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제한 시간 5밀리초가 지나면 else가 전체 결과를 만듭니다. 두 명령 모두 종료 코드 0으로 끝납니다.
-1시간이 초과되면 먼저 끝난 작업을 포함해 어떤 작업의 결과도 반환하지 않습니다. 직접 작성한 작업이 끝나야 한다면 반복 조건이나 입력을 고치세요. 시간 초과 값을 반환해도 미완료 작업 자체를 고치지는 않습니다.
완료·시간 초과·실행 오류 구분하기
| 발생한 일 | 표현식의 결과 |
|---|---|
| 제한 시간 전에 모든 작업이 끝남 | 작업마다 필드 하나를 담은 레코드 |
| 제한 시간이 먼저 지남 | else 블록의 값 |
| 제한 시간 전에 작업에서 실행 오류 발생 | else를 실행하지 않고 전체 표현식이 실행 오류로 끝남 |
실행 오류인 fault는 배열 범위 초과처럼 실행을 멈추는 오류입니다. Err(error)를 반환하는 작업은 일반적인 Result 값을 만들고 완료됩니다. 그 값은 해당 작업 이름의 필드에 들어갑니다. else는 시간 초과를 처리하며, 실행 오류를 잡거나 Err에서 값을 꺼내지 않습니다.
else 결과의 타입은 성공한 결과 레코드와 호환되어야 합니다. 두 예제 모두 양쪽에서 같은 필드 이름과 호환되는 필드 타입을 사용합니다.
출력 순서 정하기
출력 순서가 중요하면 concurrent가 반환한 뒤 출력하세요. 작업 이름은 결과를 구분하지만, 런타임은 작업의 시작·완료 순서를 정하지 않습니다. 작업들의 출력이 섞이는 순서, 공평하게 실행 기회를 받는지, 실행마다 같은 순서로 섞이는지도 정해져 있지 않습니다.
시간 초과 뒤 미완료 작업의 취소와 리소스 정리는 런타임이 결정합니다. 더 이상 결과를 기다리지 않는 작업에서 뒤늦게 난 실행 오류는 토파즈 표현식에 전달되지 않습니다. 특정 취소·정리 순서에 의존하지 마세요.
유효한 제한 시간 쓰기
5ms나 3s처럼 정수 바로 뒤에 ms, s, m을 붙이세요. 공백이나 .seconds 같은 속성 형식은 사용할 수 없습니다. 시간 리터럴은 concurrent의 timeout 자리에 씁니다.
밀리초로 바꾼 값은 부호 없는 u64 범위인 0부터 18446744073709551615까지여야 합니다. 이를 넘으면 TPZ5001이 발생합니다. 리터럴을 지원 범위 안의 값으로 줄이세요.
| 단위 | 허용하는 최대 리터럴 |
|---|---|
| 밀리초 | 18446744073709551615ms |
| 초 | 18446744073709551s |
| 분 | 307445734561825m |
작업 이름은 서로 다르게 쓰세요. 제한 시간을 지정하면 else가 필요합니다. concurrent { ... }는 제한 시간 없이 모든 작업을 기다리며 else를 붙일 수 없습니다. 애플리케이션 예제에는 제한 시간을 명시하세요.
토파즈에는 암묵적 비동기 실행, async/await, 공개 작업 핸들, 일반적인 시간 연산이 없습니다. 실행 오류와 순서는 런타임 동작에서, 미지원 문법은 금지·유예 형식에서 확인하세요.