我在GO中在Google App Engine上的超时有问题。该应用似乎不想花费大于5秒钟的时间更长(它忽略了更长的超时,并且在其时间之后忽略了时间)。
我的代码是:
var TimeoutDuration time.Duration = time.Second*30
func Call(c appengine.Context, address string, allowInvalidServerCertificate bool, method string, id interface{}, params []interface{})(map[string]interface{}, error){
data, err := json.Marshal(map[string]interface{}{
"method": method,
"id": id,
"params": params,
})
if err != nil {
return nil, err
}
req, err:=http.NewRequest("POST", address, strings.NewReader(string(data)))
if err!=nil{
return nil, err
}
tr := &urlfetch.Transport{Context: c, Deadline: TimeoutDuration, AllowInvalidServerCertificate: allowInvalidServerCertificate}
resp, err:=tr.RoundTrip(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
result := make(map[string]interface{})
err = json.Unmarshal(body, &result)
if err != nil {
return nil, err
}
return result, nil
}
无论我尝试将TimeoutDuration
设置为什么,App Times在大约5秒钟后播出。如何阻止它这样做?我在代码中犯了一些错误吗?
您需要这样的时间持续时间(否则它将默认为5秒超时):
tr := &urlfetch.Transport{Context: c, Deadline: time.Duration(30) * time.Second}
更新2016年1月2日:
使用新的Gae Golang软件包(google.golang.org/appengine/*
),这已经改变。urlfetch
不再收到运输的截止时间。
现在,您应该通过新的上下文软件包设置超时。例如,这是您设置1分钟截止日期的方式:
func someFunc(ctx context.Context) {
ctx_with_deadline, _ := context.WithTimeout(ctx, 1*time.Minute)
client := &http.Client{
Transport: &oauth2.Transport{
Base: &urlfetch.Transport{Context: ctx_with_deadline},
},
}
尝试下面的代码:
// createClient is urlfetch.Client with Deadline
func createClient(context appengine.Context, t time.Duration) *http.Client {
return &http.Client{
Transport: &urlfetch.Transport{
Context: context,
Deadline: t,
},
}
}
这是如何使用它。
// urlfetch
client := createClient(c, time.Second*60)
礼貌@gosharplite
查看GO的appengine的源代码:
- http://code.google.com/p/appengine-go/source/browse/appengine/urlfetch/urlfetch.go
和原活页生成的代码:
- http://code.google.com/p/appengine-go/source/browse/appengine_internal/urlfetch/urlfetch_service.pb.go
看起来持续时间本身不应该有问题。
我的猜测是5秒钟后Appengine Timeouts内部的整个应用程序。
对我来说,这有效:
ctx_with_deadline, _ := context.WithTimeout(ctx, 15*time.Second)
client := urlfetch.Client(ctx_with_deadline)
现在随着库的最新更新而更改了这一点。现在,超时/延迟必须在上下文中携带,urlfetch.transport
不再有截止日期字段。context.WithTimeout
或context.WithDeadline
是使用的方法,这是链接https://godoc.org/golang.org/x/net/context#withtimeoutout