60 lines
		
	
	
		
			915 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			915 B
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package local provides a local task runner
 | 
						|
package local
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"sync"
 | 
						|
 | 
						|
	"github.com/micro/go-micro/sync/task"
 | 
						|
)
 | 
						|
 | 
						|
type localTask struct {
 | 
						|
	opts   task.Options
 | 
						|
	mtx    sync.RWMutex
 | 
						|
	status string
 | 
						|
}
 | 
						|
 | 
						|
func (l *localTask) Run(t task.Command) error {
 | 
						|
	ch := make(chan error, l.opts.Pool)
 | 
						|
 | 
						|
	for i := 0; i < l.opts.Pool; i++ {
 | 
						|
		go func() {
 | 
						|
			ch <- t.Execute()
 | 
						|
		}()
 | 
						|
	}
 | 
						|
 | 
						|
	var err error
 | 
						|
 | 
						|
	for i := 0; i < l.opts.Pool; i++ {
 | 
						|
		er := <-ch
 | 
						|
		if err != nil {
 | 
						|
			err = er
 | 
						|
			l.mtx.Lock()
 | 
						|
			l.status = fmt.Sprintf("command [%s] status: %s", t.Name, err.Error())
 | 
						|
			l.mtx.Unlock()
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	close(ch)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (l *localTask) Status() string {
 | 
						|
	l.mtx.RLock()
 | 
						|
	defer l.mtx.RUnlock()
 | 
						|
	return l.status
 | 
						|
}
 | 
						|
 | 
						|
func NewTask(opts ...task.Option) task.Task {
 | 
						|
	var options task.Options
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&options)
 | 
						|
	}
 | 
						|
	if options.Pool == 0 {
 | 
						|
		options.Pool = 1
 | 
						|
	}
 | 
						|
	return &localTask{
 | 
						|
		opts: options,
 | 
						|
	}
 | 
						|
}
 |