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

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

    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就可以很好的实现多线程和线程同步了。

转载于:https://my.oschina.net/zlLeaf/blog/203647

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值