Prazos e relógios
apos, a_cada e cancelar — sem uma thread por relógio.
Um relógio por thread é o jeito ingênuo: mil temporizadores, mil threads dormindo. O laço guarda todos os prazos num heap e dorme até o mais próximo — mil temporizadores custam uma thread.
dataforge
adopt Arcane.Laco as L
laco := L.novo()
batidas := []
relogio := L.a_cada(laco, 10, lambda => batidas.append("tique"))
L.apos(laco, 35, lambda => L.cancelar(relogio)) // para o relógio
L.apos(laco, 60, lambda => L.parar(laco))
L.rodar(laco)
// cancelado aos 35 ms: no máximo 3 batidas de 10 ms — e ao menos uma.
// Num computador carregado podem ser menos; nunca mais.
assert len(batidas) bigger_eq 1 and len(batidas) smaller_eq 3
assert L.cancelada(relogio)| Função | Faz |
|---|---|
L.agendar(laco, acao) | na próxima volta |
L.apos(laco, ms, acao) | uma vez, depois de ms |
L.a_cada(laco, ms, acao) | a cada ms, até ser cancelado |
L.cancelar(tarefa) | desmarca — vale para tarefa e para fibra |