TODO:Go语言goroutine和channel使用

goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管理。使用的时候在函数前面加“go”这个单词作为关键词,也是与普通函数的区别了。在函数前面加go关键字就可以创建一个新的goroutine进行并发执行。

go hello()

channel是Go语言提供的goroutine间的通信方式,我们可以使用channel在两个或多个goroutine之家传递消息。channel使用的关键字是用“chan”,声明一个传递类型为int的channel:

var ch chan int

下面小编举一个例子,监听进程被关闭后触发的事件。

监听信号,使用

signal.Notify(c, os.Interrupt)

第一个参数表示接收信号的channel

第二个及后面的参数表示设置要监听的信号,如果不设置表示监听所有的信号。

完整例子如下,本例在Ubuntu14.04的服务版测试通过。

Ctrl+c的效果如图:

Kill进程的效果如图

简单的例子,希望对您有帮助。



wxgzh:ludong86

时间: 2024-11-04 12:00:50

TODO:Go语言goroutine和channel使用的相关文章

go语言系列-从Goroutine到Channel

Golang语言的核心特色 目录 Goroutine 基本介绍 进程和线程介绍 程序.进程和线程的关系示意图 并发和并行 Go协程和Go主线程 快速入门 案例说明 小结 goroutine的调度模型 MPG模式运行的状态 -1 MPG模式运行的状态 - 2 设置Go运行的CPU数 Channel(管道) 看个需求 不同goroutine之间如何通讯 使用全局变量加锁同步改进程序 为什么需要channel channel的基本介绍 定义/声明channel 管道的初始化.写入数据到管道.从管道读取

Go语言入门(七)goroutine和channel

goroutine和channel goroutine 多线程 func hello() { //fmt.Printf("Hello Goroutine!!\n") for i:=0;i<100;i++ { fmt.Printf("hello:%d\n",i) time.Sleep(time.Millisecond) } } func main() { go hello() //启动了一个独立的线程,使其与下面的代码交替执行,使之成为一个多线程 //fmt.P

Go语言的管道Channel用法

本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- v // 将 v 送入 channel ch. v := <-ch // 从 ch 接收,并且赋值给 v. ("箭头"就是数据流的方向.) 和 map 与 slice 一样,channel 使用前必须创建: ch := make(chan int) 默认情况下,在另一端准备好之前,

Go语言8-goroutine和channel

Goroutine Go语言从语言层面上就支持了并发,这与其他语言大不一样.Go语言中有个概念叫做goroutine,这类似我们熟知的线程,但是更轻. 进程.线程.协程 进程和线程进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位.线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行.所以程序的类型可以分为以下几种: 一个进程,它只有一个线程,就是单线程程序 一

Go基础--goroutine和channel

goroutine 在go语言中,每一个并发的执行单元叫做一个goroutine 这里说到并发,所以先解释一下并发和并行的概念: 并发:逻辑上具备同时处理多个任务的能力 并行:物理上在同一时刻执行多个并发任务 当一个程序启动时,其主函数即在一个单独的goroutine中运行,一般这个goroutine是主goroutine 如果想要创建新的goroutine,只需要再执行普通函数或者方法的的前面加上关键字go 通过下面一个例子演示并发的效果,主goroutine会计算第45个斐波那契函数,在计算

golang语言并发与并行——goroutine和channel的详细理解(一)

如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人. Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据. 以下是我入门的学习笔记. Go语言的goroutines.信道和死锁 goroutine Go语言中有个概念叫做goroutine, 这类似我们熟知的线程,但是更轻. 以下的程序,我们串行地去执行两次loop函数: func loop() { for i := 0; i < 10; i++ { f

golang goroutine、channel和select

goroutine package main import "fmt" import "time" func printn(id int){ for i := 0;i<10;i++ { fmt.Println(id,":",i) } } func main(){ for i :=0;i<5;i++ { go printn(i) } fmt.Println("waiting...") time.Sleep(time.

golang的goroutine与channel

Golang的goroutine是非抢占式的, 令人相当蛋疼! 有痛不能呻吟...只能配合channel在各goroutine之间传递信号来实现抢占式, 而这形成了golang最灵活与最具性能的核心. 相信, 彩虹总在风雨后... 学会process, thread, routine之间的配合与取舍. 关于channel的猜测: Golang中Channel的阻塞规则, 注意顺序: Write端依赖于Read端, 对于无缓冲Channel, 如果没有goroutine去消费Channel, 则w

go语言--goroutine

一.goroutine goroutine就是Go语言提供的一种用户态线程.Go自己实现了goroutine的调度器(Scheduler),Go的调度器由三部分组成: M:指的是Machine,一个M直接关联了一个内核线程. P:指的processer,代表M所需的上下文环境,也是处理用户级代码逻辑的处理器.P的数量可以通过GOMAXPROCS()来设置,默认值是CPU的核数. G:指的是goroutine,其实本质上也是一种轻量级的线程. 二.goroutine和线程的区别 1.内存占用 创建