type task struct {
fn func() error
ret chan error
}
type tasks struct {
ts chan task
}
func (t *tasks) run() {
for {
select {
case k := <-t.ts:
go func(k task) {
k.ret <- k.fn()
}(k)
}
}
}
func (t *tasks) submit(fn func() error) error {
k := task{fn: func() (err error) {
defer func() {
if err1 := recover(); err1 != nil {
err = fmt.Errorf("%+v", err1)
}
}()
return fn()
}, ret: make(chan error, 1)}
t.ts <- k
return <-k.ret
}
func TestName(t *testing.T) {
tsk := tasks{ts: make(chan task, 100)}
go tsk.run()
for i := 0; i < 1000; i++ {
_i := i
if err := tsk.submit(func() error {
if _i == 100 {
return errors.New("\n\n\n100\n\n\n")
}
fmt.Println(_i)
time.Sleep(time.Millisecond)
return nil
}); err != nil {
fmt.Println(err)
}
}
time.Sleep(time.Second)
}