Pular para o conteúdo

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çãoFaz
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