一个简单的golang goroutine 高并发的任务处理实现

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)
}
posted @ 2020-06-09 16:57  白云辉  阅读(710)  评论(0编辑  收藏  举报