一個簡單的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