原文链接 https://golangbot.com/goroutines/

Goroutines

Goroutines 可以被认为是多个函数或方法同时允许。可以认为是一个轻量级的线程。与线程的花费相比是非常小的。

与线程相比的优势

  • Goroutines 非常的轻量级,只需要几kb的内存分配 并且是可以根据需要动态可伸缩的。而线程的内存分配大小是固定的
  • Goroutines 可以多路复用到几个OS线程中。可能只有一个线程对应到很多歌Goroutines.如果有任何一个Goroutine等待了 比如说需要用户输入 那么另外一个OS线程就会被创建 然后剩下的Goroutines 就会被移动到新的OS线程中被执行
  • Goroutines使用channels沟通。channels被设计在多个Goroutines共享内存时 防止竞态的发生。channels可以被认为是Goroutines的沟通管道

开始运行一个Goroutine

例子

package main

import (
"fmt"
) func hello() {
fmt.Println("Hello world goroutine")
}
func main() {
go hello() //time.Sleep(1 * time.Second)
//fmt.Println("main function") fmt.Println("main function")
}

执行这段程序之后 不会有任何输出

  • 当执行一个Goroutine,goroutine会立即返回并执行下一段代码 以至于任何goroutine的返回值都会被忽略掉
  • 当主Goroutine停止之后 其它任何的Goroutie也都会被终止

channels

  • channels可以认为是Goroutines的沟通通道。

例子

package main
import (
"fmt"
) func hello(done chan bool){
fmt.Println("hello goroutine")
done <- true
} func main(){
done := make(chan bool) go hello(done) <-done fmt.Println("main function")
}
  • <-done 这行代码会阻止程序继续往下运行 直到Goroutine写了数据到这个channel之中 然后channel里面收到数据之后 程序会继续往下进行
  • 如果需要等待多个Goroutine 则需要发送多个值到channel 也相应的要有多个相对应的接收channel

Deadlock

  • 如果从一个Goroutine通过通道发送了数据 那么被认为会有另外一个Goroutine接收相对应的数据 如果没有的话就会产生paninc 也就发生了死锁

  • 相似的 如果Goroutine从一个channel钟等待数据 那么应该会有另外一个Goroutine通过channle发送数据 否则的话也会发生paninc

例子

package main

func main() {
ch := make(chan int)
ch <- 5
}
  • fatal error: all goroutines are asleep - deadlock!

Unidirectional channels(单向channel)

例子1

package main

import "fmt"

func sendData(sendch chan<- int) {
sendch <- 10
} func main() {
sendch := make(chan<- int) //只运行向channel发送数据 go sendData(sendch)
fmt.Println(<-sendch) //这里从channel钟接收数据 则报错
}

例子2

//这里定义了一个只往channel发送的类型
func sendData(sendch chan<- int) {
sendch <- 10
} func main() {
chnl := make(chan int)
go sendData(chnl)
fmt.Println(<-chnl)
}

Closing channels and for range loops on channels

  • 发送者是可以关闭channel 来通知接收者没有数据要往这个channel中发送了
  • 接收者可以使用另外一个变量来检测是否channel已经关闭了 v, ok := <- ch

例子

package main

import (
"fmt"
) func producer(c chan int){
for i:=0; i < 10; i++{
c <- i
} close(c)
} func main() {
ch := make(chan int) //for{
// v,ok := <-ch
// if ok == false{
// break
// }
//
// fmt.Println("Received ",v,ok)
//} for v := range ch{
fmt.Println("Received ",v)
}
}

Goroutines和Channels的更多相关文章

  1. 如果这种方式导致程序明显变慢或者引起其他问题,我们要重新思考来通过 goroutines 和 channels 来解决问题

    https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/09.3.md 9.3 锁和 sync 包 在一些复杂的程序中,通常通 ...

  2. Goroutines和Channels(五)

    Channels也可以用于将多个goroutine连接在一起,一个Channel的输出作为下一个Channel的输入.这种串联的Channels就是所谓的管道(pipeline).下面的程序用两个ch ...

  3. Goroutines和Channels(四)

    如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制. 一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值 ...

  4. Goroutines和Channels(三)

    clock服务器每一个连接都会起一个goroutine.在本节中我们会创建一个echo服务器,这个服务在每个连接中会有多个goroutine.大多数echo服务仅仅会返回他们读取到的内容,就像下面这个 ...

  5. Goroutines和Channels(二)

    网络编程是并发大显身手的一个领域,由于服务器是最典型的需要同时处理很多连接的程序,这些连接一般来自于彼此独立的客户端. 本小节,我们会讲解go语言的net包,这个包提供编写一个网络客户端或者服务器程序 ...

  6. Goroutines和Channels(一)

    Go语言中的并发程序可以用两种手段来实现.本章讲解goroutine和channel,其支持“顺序通信进程”(communicating sequential processes)或被简称为CSP.C ...

  7. ARTS-S golang goroutines and channels(二)

    向tcp服务端发消息 package main import ( "io" "log" "net" "os" ) fun ...

  8. ARTS-S golang goroutines and channels(一)

    先用golang实现一个简单的tcp服务端,假定文件名为clock1.go // clock1.go package main import ( "fmt" "io&qu ...

  9. [转]50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs

    http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/ 50 Shades of Go: Traps, Gotc ...

随机推荐

  1. Codeforces 163E(ac自动机、树状数组)

    要点 显然ac自动机的板子就可以暴力一下答案了 为了优化时间复杂度,考虑套路fail树的dfs序.发现本题需要当前这个尾点加上所有祖先点的个数,考虑使用树状数组差分一下,在父点+1,在子树后-1,每次 ...

  2. Polly+AspectCore实现熔断与降级机制

    Polly+AspectCore实现熔断与降级机制 https://www.cnblogs.com/edisonchou/p/9159644.html 一.熔断.降级与AOP 1.1 啥是熔断? 在广 ...

  3. net core mvc剖析:启动流程

    net core mvc剖析:启动流程 asp.net core mvc是微软开源的跨平台的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平台,然后又增加了一些非常实用的新功能,比如taghe ...

  4. ES6:string.raw浅析

    当前正学习ES6 ,遇到string.raw费心思,现将试验后的结果整理如下: 网上得来的试验: 语法 String.raw`templateStr`; String.raw(obj, ...subs ...

  5. 5. 把一幅彩色图像的H、S、I分量单独显示。

    #include <cv.h> #include <highgui.h> # include <math.h> #define M_PI 3.1415 void R ...

  6. redis启动内存不足

    redis-server.exe redis.windows.conf  --maxheap 2gb

  7. 面向切面编程 (AOP )的理解

    AOP的全称: Aspact  Oriented  Programming AOP的目标(作用):让我们可以“专心做事”  日志记录,事务处理,异常捕获,缓存操作. AOP原理 将复杂的需求分解出不同 ...

  8. MVC的viewPage 通用属性运用。

    试想下在MVC的前端页面JS或者html中需要使用多语言,而后端的多语言是维护在资源文件中的,前端如果使用的话需要使用AJAX频繁的获取,一个页面中可能会存在大量的需要语言转换的地方,频繁使用AJAX ...

  9. Redis hash(哈希)

    Redis hash可储存多个键值对,适合储存对象的属性. 1.hset key fieldName fileValue    //hset即hash set,set这里是设置的意思.往hash中添加 ...

  10. R语言笔记2

    <13: Simulation> > sample(1:6,4,replace=TRUE) [1] 4 5 2 6 在1-6的整数中随机生成4个整数,且数字可以重复,即每个数字均可重 ...