delay パッケージは、Task Queue API を使用して、ユーザー リクエストのスコープ外でコードを実行する方法を提供します。
後で実行可能な関数を宣言するには、最上位レベルの割り当てコンテキストで Func を呼び出し、任意の文字列キーと最初の引数が context.Context 型の関数を渡します。キーは、後で呼び出せるように関数を検索するために使用されます。
var laterFunc = delay.Func("key", myFunc)
関数リテラルを使用することもできます。
var laterFunc = delay.Func("key", func(c context.Context, x string) { // ... })
関数を呼び出すには、その関数を指定して Call メソッドを呼び出します。
laterFunc.Call(c, "something")
関数は任意の回数だけ呼び出すことができます。関数に戻り引数があり、最後の引数が error 型である場合、その関数は再試行する必要があることを通知するために nil 以外のエラーを返す場合があります。
関数には、gob パッケージでエンコード可能な任意の型の引数を指定できます。引数が interface 型で、gob パッケージへの登録がクライアント側の役割である場合、その引数には具体的な型であればどのようなものでも渡すことができます。詳細については、http://golang.org/pkg/gob/#Register をご覧ください。
関数の初期化中または実行中に発生したエラーは、アプリケーション ログに記録されます。初期化中に発生したエラーログは、その Call メソッドを呼び出したリクエストに関連付けられます。
まだ正常に実行されていない関数呼び出しの状態は、その関数の宣言が行われたファイルの名前と Func 関数に渡された文字列キーの組み合わせで保持されます。保留中の関数呼び出しを持つアプリの更新は、関連する関数でファイル名とキーの組み合わせが保持されている限り安全です。ファイル名は、次のルールに従って解析されます。
- パッケージ メイン内のパスはファイル名のみに短縮されます(github.com/foo/foo.go -> foo.go)。
- パスはパッケージパスのみになります(/go/src/github.com/foo/bar.go -> github.com/foo/bar.go)
- モジュールのバージョンが削除されます(/go/pkg/mod/github.com/foo/bar@v0.0.0-20181026220418-f595d03440dc/baz.go -> github.com/foo/bar/baz.go)
大きな変更が含まれる更新では、保留中の関数呼び出しが失われるというリスクが本質的に存在します。たとえば、GOPATH の使用から go.mod への切り替えは大規模な変更であり、ファイルパスが誤って変更される可能性があります。
delay パッケージは、Task Queue API を使用して、予約済みのアプリケーション パス「/_ah/queue/go/delay」を呼び出すタスクを作成します。このパスは、app.yaml で「login: required」とマーク付けしないでください。「login: admin」とマーク付けするか、アクセス制限を設定しないようにする必要があります。
関数
func RequestHeaders
func RequestHeaders(c context.Context) (*taskqueue.RequestHeaders, error)
RequestHeaders は、現在のタスクキュー ハンドラ用の特別なタスクキュー HTTP リクエスト ヘッダーを返します。delay.Func の外部から呼び出された場合はエラーを返します。
Function
type Function struct {
// contains filtered or unexported fields
}
Function は、遅延呼び出しを持つことができる関数を表します。
func Func
Func は新しい関数を宣言します。2 番目の引数は、最初の引数が context.Context 型の関数にする必要があります。この関数は、プログラムの初期化時に呼び出す必要があります。つまり、グローバル変数の宣言時に呼び出すか、init 関数から呼び出す必要があります。関数呼び出しを遅延させるインスタンスが、その関数を実行するインスタンスであってはならないため、このような制限が必要となります。リクエストを受け取る前にインスタンスによって実行されていることが保証されるのは、プログラムの初期化時に実行されたコードだけです。
func (*Function) Call
Call は、遅延された関数を呼び出します。
err := f.Call(c, ...)
は、次と等価です
t, _ := f.Task(...)
_, err := taskqueue.Add(c, t, "")
func (*Function) Task
Task は、関数を呼び出すタスクを作成します。関数のパラメータは、キューに追加する前に調整できます。返された Task の Path または Payload フィールドをユーザーが変更してはなりません。