google.golang.org/appengine/delay 包 (v1.6.8)

Delay 软件包提供使用任务队列 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 软件包编码的任何类型。如果参数是接口类型,那么客户端应向 gob 软件包注册该参数可能传递的所有具体类型;如需了解详情,请参阅 http://golang.org/pkg/gob/#Register

初始化或执行函数期间发生的任何错误都将记入应用日志中。初始化期间产生的错误日志与调用 Call 方法的请求有关。

如果函数调用尚未成功执行,则其状态是通过结合用于声明该函数的文件名与传递给 Func 函数的字符串键来保留的。更新具有待处理的函数调用的应用时,只要相关函数保留了 (文件名, 键) 组合,那么此操作应该是安全的。系统会根据以下规则解析文件名:

  • 软件包 main 中的路径简称为文件名 (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 外部调用,则返回错误。

函数

type Function struct {
	// contains filtered or unexported fields
}

Function 代表可能延迟调用的函数。

func Func

func Func(key string, i interface{}) *Function

Func 声明一个新函数。第二个参数必须是一个函数,且其第一个参数的类型是 context.Context。该函数必须在程序初始化时调用。这意味着必须在全局变量声明或 init 函数中调用它。 由于延迟函数调用的实例可能不是执行该调用的实例,因此这项限制是必不可少的。只有在程序初始化期间执行的代码才能保证在接收请求之前先被实例运行。

func (*Function) Call

func (f *Function) Call(c context.Context, args ...interface{}) error

Call 调用了一个延迟的函数。

err := f.Call(c, ...)

等效于

t, _ := f.Task(...)
_, err := taskqueue.Add(c, t, "")

func (*Function) Task

func (f *Function) Task(args ...interface{}) (*taskqueue.Task, error)

Task 创建一个将调用该函数的任务。 在将 Task 添加到队列之前,可以调整其参数。 用户不应修改返回的 Task 的 Path 或 Payload 字段。