23 · Concorrência
Limitando o trabalho concorrente
`parallel(limit: 2) [for id in ids => await load_profile(id)]` processa um array com no máximo dois trabalhos ativos e devolve os resultados na ordem de entrada.
Nesta página
parallel(limit: 2) [for id in ids => await load_profile(id)] processa um array com no máximo dois trabalhos ativos e devolve os resultados na ordem de entrada. O exemplo conta os trabalhos ativos para conferir o limite e depois verifica uma entrada vazia e a cópia dos itens da fonte.
Limitando o trabalho concorrente.
var active = 0
var peak = 0
async fn load_profile(id: int) -> int {
active += 1
if active > peak { peak = active }
defer { active -= 1 }
sleep 2ms
return id * 10
}
let profiles = parallel(limit: 2) [for id in [1, 2, 3, 4] => await load_profile(id)]
assert_eq(peak, 2)
assert_eq(active, 0)
assert_eq(profiles.len(), 4)
assert_eq(profiles[0], 10)
assert_eq(profiles[3], 40)
print(peak)
print(profiles[0])
print(profiles[3])
let no_ids: [int] = []
let empty = parallel(limit: 4) [for id in no_ids => id]
assert_eq(empty.len(), 0)
// The pool snapshots source items before evaluating any mapper.
let mut ids = [1, 2, 3]
let original = parallel(limit: 1) [for id in ids => { ids[1] = 99; id }]
assert_eq(original[1], 2)
assert_eq(ids[1], 99)
O limite inteiro positivo e a fonte são avaliados uma vez, nessa ordem. Um grupo fixo de trabalhadores pega o próximo item ao terminar o atual; não há uma tarefa criada para cada entrada. A cópia da fonte protege os itens pendentes de alterações posteriores. Uma falha cancela os outros trabalhos e aguarda a limpeza antes de propagar o erro. A concorrência é cooperativa; cálculos sem suspensão não ganham threads do sistema. Disponível na VM, nativo e LLVM; wasm-aot informa a limitação do escalonador.
Veja também