forked from yuxh/gearman-go
		
	race is bad, how should we do?
This commit is contained in:
		
							parent
							
								
									e3f789bc86
								
							
						
					
					
						commit
						c8f2f5085c
					
				@ -9,6 +9,7 @@ import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"net"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@ -114,6 +115,7 @@ func (client *Client) readLoop() {
 | 
			
		||||
			client.err(err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Printf("[%X]", data)
 | 
			
		||||
		client.in <- data
 | 
			
		||||
	}
 | 
			
		||||
	close(client.in)
 | 
			
		||||
@ -191,10 +193,6 @@ func (client *Client) handleInner(key string, resp *Response) {
 | 
			
		||||
// Internal do
 | 
			
		||||
func (client *Client) do(funcname string, data []byte,
 | 
			
		||||
	flag uint32) (handle string, err error) {
 | 
			
		||||
	id := IdGen.Id()
 | 
			
		||||
	req := getJob(id, []byte(funcname), data)
 | 
			
		||||
	req.DataType = flag
 | 
			
		||||
	client.write(req)
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	wg.Add(1)
 | 
			
		||||
	client.mutex.RLock()
 | 
			
		||||
@ -208,6 +206,10 @@ func (client *Client) do(funcname string, data []byte,
 | 
			
		||||
		}
 | 
			
		||||
		handle = resp.Handle
 | 
			
		||||
	})
 | 
			
		||||
	id := IdGen.Id()
 | 
			
		||||
	req := getJob(id, []byte(funcname), data)
 | 
			
		||||
	req.DataType = flag
 | 
			
		||||
	client.write(req)
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
@ -260,10 +262,6 @@ func (client *Client) DoBg(funcname string, data []byte,
 | 
			
		||||
// Get job status from job server.
 | 
			
		||||
// !!!Not fully tested.!!!
 | 
			
		||||
func (client *Client) Status(handle string) (status *Status, err error) {
 | 
			
		||||
	req := getRequest()
 | 
			
		||||
	req.DataType = GET_STATUS
 | 
			
		||||
	req.Data = []byte(handle)
 | 
			
		||||
	client.write(req)
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	wg.Add(1)
 | 
			
		||||
	client.mutex.Lock()
 | 
			
		||||
@ -277,25 +275,27 @@ func (client *Client) Status(handle string) (status *Status, err error) {
 | 
			
		||||
			client.err(err)
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
	req := getRequest()
 | 
			
		||||
	req.DataType = GET_STATUS
 | 
			
		||||
	req.Data = []byte(handle)
 | 
			
		||||
	client.write(req)
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Send a something out, get the samething back.
 | 
			
		||||
func (client *Client) Echo(data []byte) (echo []byte, err error) {
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	wg.Add(1)
 | 
			
		||||
	client.innerHandler["e"] = ResponseHandler(func(resp *Response) {
 | 
			
		||||
		defer wg.Done()
 | 
			
		||||
		echo = resp.Data
 | 
			
		||||
	})
 | 
			
		||||
	req := getRequest()
 | 
			
		||||
	req.DataType = ECHO_REQ
 | 
			
		||||
	req.Data = data
 | 
			
		||||
	client.write(req)
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	wg.Add(1)
 | 
			
		||||
	client.mutex.Lock()
 | 
			
		||||
	client.lastcall = "e"
 | 
			
		||||
	client.innerHandler["e"] = ResponseHandler(func(resp *Response) {
 | 
			
		||||
		defer wg.Done()
 | 
			
		||||
		defer client.mutex.Unlock()
 | 
			
		||||
		echo = resp.Data
 | 
			
		||||
	})
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -22,30 +22,30 @@ const (
 | 
			
		||||
	RES_STR = "\x00RES"
 | 
			
		||||
 | 
			
		||||
	// package data type
 | 
			
		||||
	CAN_DO          = 1
 | 
			
		||||
	CANT_DO         = 2
 | 
			
		||||
	RESET_ABILITIES = 3
 | 
			
		||||
	PRE_SLEEP       = 4
 | 
			
		||||
	NOOP            = 6
 | 
			
		||||
	JOB_CREATED     = 8
 | 
			
		||||
	GRAB_JOB        = 9
 | 
			
		||||
	NO_JOB          = 10
 | 
			
		||||
	JOB_ASSIGN      = 11
 | 
			
		||||
	WORK_STATUS     = 12
 | 
			
		||||
	WORK_COMPLETE   = 13
 | 
			
		||||
	WORK_FAIL       = 14
 | 
			
		||||
	GET_STATUS      = 15
 | 
			
		||||
	ECHO_REQ        = 16
 | 
			
		||||
	ECHO_RES        = 17
 | 
			
		||||
	ERROR           = 19
 | 
			
		||||
	STATUS_RES      = 20
 | 
			
		||||
	SET_CLIENT_ID   = 22
 | 
			
		||||
	CAN_DO_TIMEOUT  = 23
 | 
			
		||||
	WORK_EXCEPTION  = 25
 | 
			
		||||
	WORK_DATA       = 28
 | 
			
		||||
	WORK_WARNING    = 29
 | 
			
		||||
	GRAB_JOB_UNIQ   = 30
 | 
			
		||||
	JOB_ASSIGN_UNIQ = 31
 | 
			
		||||
	CAN_DO          = 0x1
 | 
			
		||||
	CANT_DO         = 0x2
 | 
			
		||||
	RESET_ABILITIES = 0x3
 | 
			
		||||
	PRE_SLEEP       = 0x4
 | 
			
		||||
	NOOP            = 0x6
 | 
			
		||||
	JOB_CREATED     = 0x8
 | 
			
		||||
	GRAB_JOB        = 0x9
 | 
			
		||||
	NO_JOB          = 0xa
 | 
			
		||||
	JOB_ASSIGN      = 0xb
 | 
			
		||||
	WORK_STATUS     = 0xc
 | 
			
		||||
	WORK_COMPLETE   = 0xd
 | 
			
		||||
	WORK_FAIL       = 0xe
 | 
			
		||||
	GET_STATUS      = 0xf
 | 
			
		||||
	ECHO_REQ        = 0x10
 | 
			
		||||
	ECHO_RES        = 0x11
 | 
			
		||||
	ERROR           = 0x13
 | 
			
		||||
	STATUS_RES      = 0x14
 | 
			
		||||
	SET_CLIENT_ID   = 0x16
 | 
			
		||||
	CAN_DO_TIMEOUT  = 0x17
 | 
			
		||||
	WORK_EXCEPTION  = 0x19
 | 
			
		||||
	WORK_DATA       = 0x1c
 | 
			
		||||
	WORK_WARNING    = 0x1d
 | 
			
		||||
	GRAB_JOB_UNIQ   = 0x1e
 | 
			
		||||
	JOB_ASSIGN_UNIQ = 0x1f
 | 
			
		||||
 | 
			
		||||
	SUBMIT_JOB         = 7
 | 
			
		||||
	SUBMIT_JOB_BG      = 18
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ package main
 | 
			
		||||
import (
 | 
			
		||||
    "log"
 | 
			
		||||
    "sync"
 | 
			
		||||
    "time"
 | 
			
		||||
    "github.com/mikespook/gearman-go/client"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -14,29 +13,32 @@ func main() {
 | 
			
		||||
    // by implementing IdGenerator interface.
 | 
			
		||||
    // client.IdGen = client.NewAutoIncId()
 | 
			
		||||
 | 
			
		||||
    c, err := client.New("127.0.0.1:4730")
 | 
			
		||||
    c, err := client.New("tcp4", "127.0.0.1:4730")
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Fatalln(err)
 | 
			
		||||
    }
 | 
			
		||||
    defer c.Close()
 | 
			
		||||
    c.ErrHandler = func(e error) {
 | 
			
		||||
    c.ErrorHandler = func(e error) {
 | 
			
		||||
        log.Println(e)
 | 
			
		||||
    }
 | 
			
		||||
    echo := []byte("Hello\x00 world")
 | 
			
		||||
    wg.Add(1)
 | 
			
		||||
    echomsg, err := c.Echo(echo, time.Second)
 | 
			
		||||
    echomsg, err := c.Echo(echo)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Fatalln(err)
 | 
			
		||||
    }
 | 
			
		||||
    log.Println(string(echomsg))
 | 
			
		||||
    wg.Done()
 | 
			
		||||
    jobHandler := func(job *client.Job) {
 | 
			
		||||
    jobHandler := func(job *client.Response) {
 | 
			
		||||
        log.Printf("%s", job.Data)
 | 
			
		||||
        wg.Done()
 | 
			
		||||
    }
 | 
			
		||||
    handle := c.Do("ToUpper", echo, client.JOB_NORMAL, jobHandler)
 | 
			
		||||
    handle, err := c.Do("ToUpper", echo, client.JOB_NORMAL, jobHandler)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatalln(err)
 | 
			
		||||
	}
 | 
			
		||||
    wg.Add(1)
 | 
			
		||||
    status, err := c.Status(handle, time.Second)
 | 
			
		||||
    status, err := c.Status(handle)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Fatalln(err)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user