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

[程序员] === 一个 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 应该会死锁,一直无法退出才是。

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

意见的链接
分享到其他网站

加入讨论

您现在可以发表并稍后注册. 如果您是会员,请现在登录来参与讨论.

游客
回复主题...

×   粘贴为富文本.   粘贴为纯文本来代替

  只允许使用75个表情符号.

×   您的链接已自动嵌入.   显示为链接来代替

×   您之前的内容已恢复.   清除编辑器

×   您无法直接粘贴图片.要从网址上传或插入图片.

  • 游客注册

    游客注册

  • 会员

  • 最新的状态更新

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

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