Com o atraso de pacotes é possível executar códigos fora do escopo de uma solicitação do usuário usando a API de fila de tarefas.
Para declarar uma função que possa ser executada mais tarde, chame Func em um contexto de atribuição de nível superior passando uma chave de string arbitrária e uma função em que o primeiro argumento seja do tipo context.Context. A chave é usada para procurar a função e ela pode ser chamada mais tarde.
var laterFunc = delay.Func("key", myFunc)
Também é possível usar um literal de função.
var laterFunc = delay.Func("key", func(c context.Context, x string) { // ... })
Para chamar uma função, invoque o método Call.
laterFunc.Call(c, "something")
É possível chamar uma função quantas vezes você quiser. Se a função tiver argumentos de retorno e o último for do tipo Error, a função pode retornar um erro não nulo para indicar que é necessário fazer uma nova tentativa com a função.
Os argumentos das funções podem ser de qualquer tipo que possa ser codificado pelo pacote gob. Se um argumento for do tipo Interface, é responsabilidade do cliente registrar no pacote gob, seja qual for o tipo concreto passado para esse argumento. Veja http://golang.org/pkg/gob/#Register para mais detalhes.
Os erros durante a inicialização ou a execução de uma função são registrados nos registros do aplicativo. Os registros de erros que ocorrem durante a inicialização são associados à solicitação que invocou o método Call.
O estado de uma invocação de função que ainda não foi executada é preservado por meio da combinação do nome do arquivo em que está declarada com a chave de string passada para a função Func. Atualizar um aplicativo com invocações de função pendentes é seguro desde que as funções relevantes tenham a combinação (nome de arquivo, chave) preservada. O nome do arquivo é analisado de acordo com estas regras:
- Os caminhos no pacote principal são encurtados apenas para o nome do arquivo (github.com/foo/foo.go -> foo.go)
- Os caminhos são removidos apenas para caminhos de pacotes (/go/src/github.com/foo/bar.go -> github.com/foo/bar.go)
- As versões do módulo são removidas (/go/pkg/mod/github.com/foo/bar@v0.0.0-20181026220418-f595d03440dc/baz.go -> github.com/foo/bar/baz.go)
Há algum risco inerente de perda de invocações de função pendentes durante uma atualização que contém grandes mudanças. Por exemplo, mudar do GOPATH para go.mod é uma mudança grande que pode mudar acidentalmente os caminhos dos arquivos.
O pacote de atraso usa a Task Queue API para criar tarefas que chamam o caminho reservado do aplicativo "/_ah/queue/go/delay". Este caminho não pode ser marcado como "login: required" no app.yaml, ele precisa ser marcado como "login: admin" ou não ter restrição de acesso.
Funções
Função RequestHeaders
func RequestHeaders(c context.Context) (*taskqueue.RequestHeaders, error)
A solicitação retorna os cabeçalhos especiais de solicitações HTTP da fila de tarefas para o gerenciador de fila de tarefas atual. Retornará um erro se for chamado de fora de um atraso.Func.
Função
type Function struct {
// contains filtered or unexported fields
}
Function representa uma função que pode ter uma invocação atrasada.
func Func
Func declara uma nova Function. O segundo argumento precisa ser uma função com um primeiro argumento do tipo context.Context. E preciso chamar essa função no momento da inicialização do programa. Isso significa que ela precisa ser chamada em uma declaração variável global ou a partir de uma função init. Essa restrição é necessária porque a instância que atrasa uma chamada de função pode não ser aquela que a executa. Somente o código executado na inicialização do programa tem garantia de ser executado por uma instância antes que ela receba uma solicitação.
func (*Function) Call
Call invoca uma função atrasada.
err := f.Call(c, ...)
é equivalente a
t, _ := f.Task(...)
_, err := taskqueue.Add(c, t, "")
func (*Function) Task
Task cria uma tarefa que invoca a função. Os parâmetros podem ser modificados antes que seja adicionada a uma fila. Os usuários não podem modificar os campos Path e Payload da tarefa retornada.