一个简单的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)
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM