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)
}

相关文章:

  • 2021-05-26
  • 2022-12-23
  • 2022-12-23
  • 2022-02-26
  • 2021-08-25
  • 2021-11-18
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-07-26
  • 2021-06-22
  • 2021-12-25
  • 2022-12-23
  • 2021-12-29
  • 2020-02-18
相关资源
相似解决方案