Topaz의 동시성은 암묵적 비동기가 아니라 concurrent라는 명시적 표현식으로만 사용합니다.
정책
concurrent { name: expr ... }는 이름을 붙인 모든 작업을 실행하고 각 이름을 필드로 갖는 레코드를 반환합니다. concurrent(timeout: 3s) { ... } else { ... }는 제한 시간 안에 모든 작업이 끝나면 결과 레코드를, 그렇지 않으면 else의 값을 반환합니다. 시간 리터럴은 ms, s, m을 붙인 정수입니다.
명시된 동작
제한 시간 전에 하나의 작업이 실행 오류로 종료하면 전체 표현식이 실행 오류로 종료하며 else를 선택하지 않습니다. Err는 일반적인 작업 값입니다. 제한 시간 뒤에 남은 작업을 취소하는 방식과 작업 사이의 세부 실행 순서는 런타임이 결정합니다.
제약과 명시적 거부
작업 이름은 중복될 수 없습니다. 제한 시간을 쓰면 else가 반드시 필요하고, else는 제한 시간 없이 사용할 수 없습니다. 제한 시간에는 해당 시간 리터럴만 쓸 수 있으며 일반 시간 연산은 지원하지 않습니다.
유예 경계
async/await, 키워드 기반 태스크 생성, 구조화된 취소, 사용자가 관찰할 수 있는 작업 스케줄, 실행 순서 보장은 현재 범위 밖입니다.
예제
TOPAZ
function loadUser(id: int) -> Option<string> { Some("Ada") }
function loadPosts(id: int) -> Array<string> { ["first", "second"] }
let dashboard = concurrent(timeout: 3s) {
user: loadUser(7)
posts: loadPosts(7)
} else {
{ user: None, posts: [] }
}