Mithilfe einer Paketverzögerung kann Code unter Verwendung der taskqueue API außerhalb eines Nutzer-Requests ausgeführt werden.
Um eine Funktion zu deklarieren, die später ausgeführt werden kann, rufen Sie Func in einem Zuordnungskontext der obersten Ebene auf und weisen Sie einen beliebigen Stringschlüssel sowie eine Funktion zu, deren erstes Argument den Typ context. Context. Mit dem Schlüssel können Sie die Funktion suchen, um sie später aufrufen zu können.
var laterFunc = delay.Func("key", myFunc)
Es ist auch möglich, ein Funktionsliteral zu verwenden.
var laterFunc = delay.Func("key", func(c context.Context, x string) { // ... })
Zum Aufrufen einer Funktion rufen Sie ihre Call-Methode ab.
laterFunc.Call(c, "something")
Eine Funktion kann beliebig oft aufgerufen werden. Wenn die Funktion Rückgabeargumente enthält und das letzte den Typ "Fehler" aufweist, kann die Funktion einen Nicht-Null-Fehler zurückgeben, um zu signalisieren, dass die Funktion noch einmal aufgerufen werden sollte.
Die Argumente für Funktionen können jeden Typ aufweisen, der vom gob-Paket codiert werden kann. Wenn ein Argument den Typ "Schnittstelle" hat, muss sich der Client beim gob-Paket registrieren, egal welcher konkrete Typ für dieses Argument übergeben wird. Details finden Sie unter http://golang.org/pkg/gob/#Register.
Alle Fehler während der Initialisierung oder Ausführung einer Funktion werden in den Anwendungsprotokollen verzeichnet. Fehlerprotokolle während der Initialisierung werden dem Request zugeordnet, der die Call-Methode aufgerufen hat.
Der Status eines Funktionsaufrufs, der noch nicht erfolgreich ausgeführt wurde, wird bewahrt, indem der deklarierende Dateiname mit dem Stringschlüssel kombiniert wird, der an die Func-Funktion weitergegeben wurde. Eine Anwendung mit ausstehenden Funktionsaufrufen sollte aktualisiert werden, solange die Kombination aus Dateiname und Schlüssel der relevanten Funktionen behalten wird. Der Dateiname wird gemäß den folgenden Regeln geparst:
- Pfade im Paket main werden auf den Dateinamen gekürzt (github.com/foo/foo.go -> foo.go)
- Pfade werden nur zu Paketpfaden entfernt (/go/src/github.com/foo/bar.go -> github.com/foo/bar.go)
- Modulversionen werden entfernt (/go/pkg/mod/github.com/foo/bar@v0.0.0-20181026220418-f595d03440dc/baz.go -> github.com/foo/bar/baz.go)
Es besteht ein gewisses Risiko, dass ausstehende Funktionsaufrufe während einer Aktualisierung verloren gehen, die große Änderungen enthält. Wenn Sie beispielsweise GOPATH zu go.mod wechseln, ist dies eine große Änderung, die unbeabsichtigt zu Änderungen von Dateipfaden führen kann.
Das Delay-Paket verwendet die Task Queue API zum Erstellen von Aufgaben, die den reservierten Anwendungspfad "/_ah/queue/go/delay" aufrufen. Dieser Pfad darf in app.yaml nicht als "login: required" gekennzeichnet sein. Er muss als "login: admin" gekennzeichnet sein oder keine Zugriffsbeschränkung haben.
Funktionen
func RequestHeaders
func RequestHeaders(c context.Context) (*taskqueue.RequestHeaders, error)
RequestHeaders gibt die speziellen HTTP-Anfrageheader für den aktuellen Handler für Aufgabenwarteschlangen zurück. Gibt einen Fehler zurück, wenn sie von außerhalb einer Delay.Func aufgerufen wird.
Funktion
type Function struct {
// contains filtered or unexported fields
}
"Function" stellt eine Funktion dar, die möglicherweise verzögert aufgerufen wird.
func Func
"Func" deklariert eine neue Funktion. Das zweite Argument muss eine Funktion mit einem ersten Argument des Typs "context.Context" sein. Diese Funktion muss zum Zeitpunkt der Programminitialisierung aufgerufen werden. Das bedeutet, sie muss in einer globalen Variablendeklaration oder aus einer Initialisierungsfunktion heraus aufgerufen werden. Diese Einschränkung ist notwendig, da die Instanz, die einen Funktionsaufruf verzögert, möglicherweise nicht dieselbe Instanz ist, die ihn ausführt. Nur der bei der Programminitialisierung ausgeführte Code wurde garantiert vor dem Empfang eines Requests von einer Instanz ausgeführt.
func (*Function) Call
"Call" ruft eine verzögerte Funktion auf.
err := f.Call(c, ...)
entspricht
t, _ := f.Task(...)
_, err := taskqueue.Add(c, t, "")
func (*Function) Task
"Task" erstellt eine Aufgabe, die die Funktion aufruft. Die Parameter können vor dem Hinzufügen zu einer Warteschlange optimiert werden. Nutzer sollten die Pfad- oder Nutzlastfelder der zurückgegebenen Aufgabe nicht ändern.