跳转到内容
彼岸论坛
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

[程序员] === 一个 golang goroutine 相关的问题 ===


已推荐帖子

发表于
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 应该会死锁,一直无法退出才是。

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

  • 游客注册

    游客注册

  • 会员

  • 最新的状态更新

    没有最新的状态更新
  • 最近查看

    • 没有会员查看此页面.
×
×
  • 创建新的...