如何在Golang中的并发代码中工作延迟

lh80um4z  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(150)

我有一些代码:

  1. ...
  2. func Run(tasks []Task, n, m int) error {
  3. ...
  4. for i := 0; i < n; i++ {
  5. go func() {
  6. defer wg.Done()
  7. for t := range taskCh {
  8. if atomic.LoadInt32(&errCount) >= int32(m) {
  9. return
  10. }
  11. if err := t(); err != nil {
  12. atomic.AddInt32(&errCount, 1)
  13. }
  14. }
  15. }()
  16. }
  17. for _, t := range tasks {
  18. taskCh <- t
  19. }
  20. close(taskCh)
  21. wg.Wait()
  22. if atomic.LoadInt32(&errCount) >= int32(m) {
  23. err = ErrErrorsLimitExceeded
  24. }
  25. ...
  26. }

它的工作很好,但为什么它不工作时,我写操作关闭()wg。等待,如果.推迟了吗

  1. ...
  2. defer func() {
  3. close(taskCh)
  4. wg.Wait()
  5. if atomic.LoadInt32(&errCount) >= int32(m) {
  6. err = ErrErrorsLimitExceeded
  7. }
  8. }()
  9. for i := 0; i < n; i++ {
  10. ...

当变量errCount = 0时

sxpgvts3

sxpgvts31#

这是golang的限制,你不能改变从defer函数返回的变量。正确的做法是(注意(err error)命名返回值):

  1. package main
  2. import "fmt"
  3. func someFunction() (err error) {
  4. defer func() {
  5. err = fmt.Errorf("Some error")
  6. }()
  7. err = fmt.Errorf("Some other error")
  8. return
  9. }
  10. func main() {
  11. fmt.Println(someFunction())
  12. }

https://goplay.tools/snippet/9fwcqTIwhow

展开查看全部

相关问题