delay 软件包

import "google.golang.org/appengine/delay"

简介

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 函数的字符串键来保留的。更新具有待处理的函数调用的应用时,只要相关函数保留了 (文件名, 键) 组合,那么此操作便是安全的。

Delay 软件包使用 Task Queue API 创建调用保留的应用路径“/_ah/queue/go/delay”的任务。 在 app.yaml 中,此路径不得标记为“login: required”,而必须标记为“login: admin”或不设置任何访问限制。

索引

type Function
    func Func(key string, i interface{}) *Function
    func (f *Function) Call(c context.Context, args ...interface{}) error
    func (f *Function) Task(args ...interface{}) (*taskqueue.Task, error)

type Function

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 字段。