Slide 17 de 37

Concorrência

Iniciando um trabalho e esperando por ele
proc slow(label: Str, ms: Int): Str {
	hive.task.sleep(ms)
	return label
}

proc main(): void {
	a := async slow("a", 30)      // inicia agora
	b := async slow("b", 30)      // inicia agora, em paralelo
	echo "{a} and {b}"             // espera pelos dois, aqui mesmo
}
Limitando uma espera
proc slow(label: Str, ms: Int): Str {
	hive.task.sleep(ms)
	return label
}

proc main(): void {
	if slow("c", 300) with timeout 50 is Result.Error(err) {
		echo "desistiu depois de {err.waited}ms"
	}
}
Toda chamada bloqueia quem a chamou por padrão — não existe async func, não existe Future. O que uma chamada significa é decidido onde ela é escrita: f(x) espera; async f(x) dispara e esquece; x := async f(x) a inicia e só espera quando x é lido; await [f(a), f(b)] inicia cada chamada em sua própria thread e é uma única barreira que se resolve em um vetor totalmente tipado. hive.task.sleep(ms) estaciona apenas a thread que chamou, e é por isso que dois sleeps iniciados juntos terminam em cerca do mais longo, e não na soma. Qualquer espera pode ser limitada com `with timeout <ms>`, transformando o resultado em um Result em vez de uma falha.