=== 一个 golang goroutine 相关的问题 ===

27次阅读

共计 327 个字符,预计需要花费 1 分钟才能阅读完成。

package main

import (
	"fmt"
	"io"
	"net/http"
)

func fetch(url string) string {resp, err := http.Get(url)
	if err != nil {return err.Error()
	}
	defer resp.Body.Close()
	written, err := io.Copy(io.Discard, resp.Body)
	if err != nil {return err.Error()
	}
	result := fmt.Sprintf("%s %s %d", url, resp.Status, written)
	return result
}

func request() string {ch := make(chan string)
	go func() {ch <- fetch("http://www.163.com")
	}()
	go func() {ch <- fetch("http://www.sohu.com")
	}()
	go func() {ch <- fetch("http://www.sina.com")
	}()
	result := <-ch
	return result
}

func main() {fmt.Println(request())
	fmt.Scanln()}

这里假设 163.com goroutine 总是第一个执行完,此后 request 函数执行返回。
此时,进程未退出, 另外两个 goroutine 仍将把 fetch 的结果发送到 ch,但是由于 ch 是无缓存的, 同时又因为 request 已经返回,
无人从 ch 中接收数据,所以另两个 goroutine 应该会死锁,一直无法退出才是。

但是实际执行时错不报错,这是为什么?多谢

正文完
 0