关于goroutine和channel的使用和个人见解

leaf志良 · · 1945 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

    以下是我看完一些博客文章后的个人见解。。。

    golang的一个优势是goroutine,类似一个轻量级的线程。goroutinue机制就像是一个线程池,当一个goroutinue线程被阻塞以后,资源会用来调用另外一个已经准备好的goroutinue线程。goroutinue和channel一起可以很优雅地做到程度的线程同步,以下是goroutinue和channel的简单使用。

例子一:主线程向goroutinue线程发送信息

package main

import(
	"fmt"
)

func work(stringChan chan string){
	fmt.Println(<-stringChan)

	fmt.Println("test")
}

func main() {
	stringChan := make(chan string)
	go work(stringChan)

	stringChan<-"ok"
}


输出结果如下

ok
test
finish

通过关键字go 来调用函数work,传入一个channel的参数stringChan,在work函数中监听stringChan的状态,当在main主线程中往stringChan传入一个字符串时候,work会收到信息,然后fmt.Println(<-stringChan)会输出字符串,然后继续执行。

例子二:goroutine往主线程发送信息

package main

import(
	"fmt"
)

func work(stringChan chan string){
	stringChan<-"ok"

	fmt.Println("test")
}

func main() {
	stringChan := make(chan string)
	go work(stringChan)
	
	fmt.Println(<-stringChan)
}

输出结果如下

test
ok

在这个例子中,在work函数里面,向stringChan添加字符串,此时并没有立即激活main主线程中的fmt.Println(<-stringChan),而是等work函数执行完了以后才继续main线程,假如在work中的stringChan<-"ok"之后添加一个for死循环的话,运行是没有任何输出的。。

    通过goroutine和channel就可以很好的实现多线程和线程同步了。


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:leaf志良

查看原文:关于goroutine和channel的使用和个人见解

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1945 次点击  
加入收藏 微博
1 回复  |  直到 2000-01-01 00:00:00
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传