added a timeout at the worker side

This commit is contained in:
mikespook 2012-06-04 16:12:06 +08:00
parent 83f5f6fa70
commit 6d68430f75

View File

@ -5,6 +5,7 @@
package worker package worker
import ( import (
"time"
"bytes" "bytes"
"bitbucket.org/mikespook/gearman-go/common" "bitbucket.org/mikespook/gearman-go/common"
) )
@ -237,12 +238,6 @@ func (worker *Worker) SetId(id string) {
// Execute the job. And send back the result. // Execute the job. And send back the result.
func (worker *Worker) exec(job *Job) (err error) { func (worker *Worker) exec(job *Job) (err error) {
if worker.limit != nil {
<-worker.limit
defer func() {
worker.limit <- true
}()
}
var limit int var limit int
if job.DataType == common.JOB_ASSIGN { if job.DataType == common.JOB_ASSIGN {
limit = 3 limit = 3
@ -262,7 +257,20 @@ func (worker *Worker) exec(job *Job) (err error) {
if !ok { if !ok {
return common.Errorf("The function does not exist: %s", funcname) return common.Errorf("The function does not exist: %s", funcname)
} }
result, err := f.f(job) var result []byte
if worker.limit != nil {
defer func() {
worker.limit <- true
}()
select {
case <-worker.limit:
case <-time.After(time.Second * time.Duration(f.timeout)):
err = common.Errorf("The function was executed timeout: %s", funcname)
}
}
if err == nil {
result, err = f.f(job)
}
var datatype uint32 var datatype uint32
if err == nil { if err == nil {
datatype = common.WORK_COMPLETE datatype = common.WORK_COMPLETE