async
Trabalhadores e tarefas assíncronas
Importação
_ <- fat.async
Tipos
A biblioteca async
introduz dois tipos: Worker
e Task
Worker
O Worker
é um simples invólucro para uma operação assíncrona.
Construtor
Nome | Assinatura | Breve descrição |
---|---|---|
Worker | (task: Method) | Cria um Worker em modo de espera |
Membros do protótipo
Nome | Assinatura | Breve descrição |
---|---|---|
start | (): Worker | Inicia a tarefa |
cancel | (): Void | Cancela a tarefa |
await | (): Worker | Aguarda pela conclusão da tarefa |
isDone | (): Boolean | Verifica se a tarefa foi concluída |
hasStarted | Boolean | Definido pelo método start |
hasAwaited | Boolean | Definido pelo método await |
isCanceled | Boolean | Definido pelo método cancel |
result | Any | Definido pelo método await |
Task
Uma Task
representa uma operação assíncrona com tempo limitado. Ela usa dois Workers, um para a tarefa em si e outro para o temporizador de tempo limite.
Construtor
Nome | Assinatura | Breve descrição |
---|---|---|
Task | (task: Method, wait: Number) | Cria uma Task em modo de espera |
O construtor Task
leva dois argumentos:
- task: O método a ser executado de forma assíncrona (o método pode não aceitar argumentos diretamente, mas você pode adicionar esses usando duas setas na definição
-> ->
). - wait (opcional): O tempo limite em milissegundos. Se a tarefa não terminar dentro desse tempo, ela será cancelada. O padrão é 40.000ms (40 segundos).
Membros do protótipo
Nome | Assinatura | Resumo |
---|---|---|
start | (): Task | Inicia a tarefa e seu temporizador |
cancel | (): Void | Cancela a tarefa e seu temporizador |
await | (): Task | Aguarda pela conclusão da tarefa ou timeout |
isDone | Boolean | Definido true se a tarefa foi concluída |
hasTimedOut | Boolean | Definido true se a tarefa excedeu o tempo |
result | Any | Definido pelo método await |
Método avulso
Nome | Assinatura | Breve descrição |
---|---|---|
selfCancel | (): * | Encerra a execução da thread |
Notas de uso
As instâncias de Worker
são mapeadas para threads do sistema em uma base um-para-um e são executadas conforme o agendamento do sistema. Isso implica que sua execução pode nem sempre ser imediata. Para aguardar o resultado de um Worker
ou Task
, use o método await
.
Exemplos
_ <- fat.async
math <- fat.math
time <- fat.time
# Define uma tarefa lenta
slowTask = -> {
waitTime = math.random * 5000 # Aguarda até 5 segundos
time.wait(waitTime)
waitTime
}
# Inicia a tarefa como Worker
worker = Worker(slowTask).start
# Obtém o resultado do worker
result1 = worker.await.result # bloqueia até a tarefa ser concluída
# Inicia uma tarefa com timeout
task = Task(slowTask, 3000).start
# Obtém o resultado da tarefa
result2 = task.await.result # bloqueia até a tarefa ser concluída ou ocorrer timeout
o método
await
da Task gera umAsyncError
se a tarefa exceder o tempo antes da conclusão