forked from yuxh/gearman-go
		
	Could not trust os.EOF as the end of msg's mark.
This commit is contained in:
		
							parent
							
								
									7eb966bc36
								
							
						
					
					
						commit
						82f0ab2cd5
					
				@ -1,13 +1,21 @@
 | 
			
		||||
#!/usr/bin/python
 | 
			
		||||
 | 
			
		||||
from gearman import libgearman
 | 
			
		||||
import gearman
 | 
			
		||||
 | 
			
		||||
def check_request_status(job_request):
 | 
			
		||||
    if job_request.complete:
 | 
			
		||||
        print "Job %s finished!  Result: %s - %s" % (job_request.job.unique, job_request.state, job_request.result)
 | 
			
		||||
    elif job_request.timed_out:
 | 
			
		||||
        print "Job %s timed out!" % job_request.unique
 | 
			
		||||
    elif job_request.state == JOB_UNKNOWN:
 | 
			
		||||
        print "Job %s connection failed!" % job_request.unique
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    client = libgearman.Client()
 | 
			
		||||
    client.add_server("127.0.0.1", 4730)
 | 
			
		||||
    r = client.do("ToUpper", "arbitrary binary data")
 | 
			
		||||
    print r
 | 
			
		||||
    client = gearman.GearmanClient(['localhost:4730', 'otherhost:4730'])
 | 
			
		||||
    completed_job_request = client.submit_job("ToUpper", "arbitrary binary data")
 | 
			
		||||
    check_request_status(completed_job_request)
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    main()
 | 
			
		||||
    for i in range(100):
 | 
			
		||||
        main()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,20 +1,18 @@
 | 
			
		||||
#!/usr/bin/python
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
from gearman import libgearman
 | 
			
		||||
import gearman
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def toUpper(job):
 | 
			
		||||
    r = job.get_workload().upper()
 | 
			
		||||
def toUpper(worker, job):
 | 
			
		||||
    r = job.data.upper()
 | 
			
		||||
    print r
 | 
			
		||||
    return r
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    worker = libgearman.Worker()
 | 
			
		||||
    worker.add_server("127.0.0.1", 4730)
 | 
			
		||||
    worker.add_function("ToUpper", toUpper)
 | 
			
		||||
    while True:
 | 
			
		||||
        worker.work()
 | 
			
		||||
    worker = gearman.GearmanWorker(['localhost:4730'])
 | 
			
		||||
    worker.register_task('ToUpper', toUpper)
 | 
			
		||||
    worker.work()
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    main()
 | 
			
		||||
 | 
			
		||||
@ -73,11 +73,12 @@ func (client *Client) read() (data []byte, err os.Error) {
 | 
			
		||||
    }
 | 
			
		||||
    // split package
 | 
			
		||||
    start, end := 0, 4
 | 
			
		||||
    for i := 0; i < len(data); i ++{
 | 
			
		||||
    tl := len(data)
 | 
			
		||||
    for i := 0; i < tl; i ++{
 | 
			
		||||
        if string(data[start:end]) == RES_STR {
 | 
			
		||||
            l := int(byteToUint32([4]byte{data[start+8], data[start+9], data[start+10], data[start+11]}))
 | 
			
		||||
            total := l + 12
 | 
			
		||||
            if total == len(data) {
 | 
			
		||||
            if total == tl {
 | 
			
		||||
                return
 | 
			
		||||
            } else {
 | 
			
		||||
                client.incoming <- data[total:]
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@ type jobClient struct {
 | 
			
		||||
    conn net.Conn
 | 
			
		||||
    worker *Worker
 | 
			
		||||
    running bool
 | 
			
		||||
    incoming chan []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create the client of job server.
 | 
			
		||||
@ -23,33 +24,66 @@ func newJobClient(addr string, worker *Worker) (jobclient *jobClient, err os.Err
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        return nil, err
 | 
			
		||||
    }
 | 
			
		||||
    jobclient = &jobClient{conn:conn, worker:worker, running:true}
 | 
			
		||||
    jobclient = &jobClient{conn:conn, worker:worker, running:true, incoming: make(chan []byte, QUEUE_CAP)}
 | 
			
		||||
    return jobclient, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Internal read
 | 
			
		||||
func (client *jobClient) read() (data []byte, err os.Error){
 | 
			
		||||
    if len(client.incoming) > 0 {
 | 
			
		||||
        // incoming queue is not empty
 | 
			
		||||
        data = <-client.incoming
 | 
			
		||||
    } else {
 | 
			
		||||
        for {
 | 
			
		||||
            buf := make([]byte, BUFFER_SIZE)
 | 
			
		||||
            var n int
 | 
			
		||||
            if n, err = client.conn.Read(buf); err != nil {
 | 
			
		||||
                if err == os.EOF && n == 0 {
 | 
			
		||||
                    err = nil
 | 
			
		||||
                    return
 | 
			
		||||
                }
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            data = append(data, buf[0: n] ...)
 | 
			
		||||
            if n < BUFFER_SIZE {
 | 
			
		||||
                break
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // split package
 | 
			
		||||
    start := 0
 | 
			
		||||
    tl := len(data)
 | 
			
		||||
    for i := 0; i < tl; i ++{
 | 
			
		||||
        if string(data[start:start+4]) == RES_STR {
 | 
			
		||||
            l := int(byteToUint32([4]byte{data[start+8], data[start+9], data[start+10], data[start+11]}))
 | 
			
		||||
            total := l + 12
 | 
			
		||||
            if total == tl {
 | 
			
		||||
                return
 | 
			
		||||
            } else {
 | 
			
		||||
                client.incoming <- data[total:]
 | 
			
		||||
                data = data[:total]
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            start++
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    err = os.NewError("Invalid data struct.")
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Main loop.
 | 
			
		||||
func (client *jobClient) Work() {
 | 
			
		||||
    noop := true
 | 
			
		||||
    OUT: for client.running {
 | 
			
		||||
        // grab job
 | 
			
		||||
        if noop {
 | 
			
		||||
    for client.running {
 | 
			
		||||
        // got noop msg and incoming queue is zero, grab job
 | 
			
		||||
        if noop && len(client.incoming) == 0 {
 | 
			
		||||
            client.WriteJob(NewWorkerJob(REQ, GRAB_JOB, nil))
 | 
			
		||||
        }
 | 
			
		||||
        var rel []byte
 | 
			
		||||
        for {
 | 
			
		||||
            buf := make([]byte, BUFFER_SIZE)
 | 
			
		||||
            n, err := client.conn.Read(buf)
 | 
			
		||||
            if err != nil {
 | 
			
		||||
                if err == os.EOF && n == 0 {
 | 
			
		||||
                    break
 | 
			
		||||
                }
 | 
			
		||||
                client.worker.ErrQueue <- err
 | 
			
		||||
                continue OUT
 | 
			
		||||
            }
 | 
			
		||||
            rel = append(rel, buf[0: n] ...)
 | 
			
		||||
            if n < BUFFER_SIZE {
 | 
			
		||||
                break
 | 
			
		||||
            }
 | 
			
		||||
        rel, err := client.read()
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            client.worker.ErrQueue <- err
 | 
			
		||||
            continue
 | 
			
		||||
        }
 | 
			
		||||
        job, err := DecodeWorkerJob(rel)
 | 
			
		||||
        if err != nil {
 | 
			
		||||
@ -91,6 +125,7 @@ func (client *jobClient) Write(buf []byte) (err os.Error) {
 | 
			
		||||
// Close.
 | 
			
		||||
func (client *jobClient) Close() (err os.Error) {
 | 
			
		||||
    client.running = false
 | 
			
		||||
    close(client.incoming)
 | 
			
		||||
    err = client.conn.Close()
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user