1. Goroutine 是用户态自己实现的线程,调度方式遇到IO/阻塞点方式就会让出cpu时间(其实也看编译器的实现,如果TA在代码里面插入一些yield,也是可以的。 反正现在不是抢占式的。)

  2. 不能设置goroutine ID, 也拿不到(可以调用C API或者自己修改源码暴漏出来,实际上修改起来挺简单的,因为Go的源码写的非常简洁优雅)

  3. goroutine的栈会自动扩容(初始stack很小,2KB,这也是go程序内存占用很小的原因) 4.相对java,多线程调试工具链有待完善,不过我们目前也没有发现需要这种调试的地方,实在需要时通过profile工具和简单的日志就可以( 目前有一些第三方的工具,不过因为并不需要,我们也没有使用过)

  4. 开销非常小,同时运行几百万个一点问题都没有

  5. go func(..) {} ()

  6. golang的最大特点就是这个goroutine非常简单方便,实现功能,都只要按照人类最直接的思维模式写就好(反正可以开大量的goroutine),不像回调的方式那么碎片化(nodejs),也远远不像NIO那么复杂(netty).一句话:可以用最简单的方式写出来非常高性能的并发

package main
import (
    "log"
    "sync"
    "sync/atomic"
    "time"
)
var total int32 = 0
func main() {
    // 控制子线程的任务进行,等同于Map/Reduce处理
    wg := &sync.WaitGroup{}
    // 统计运行时间
    ts := time.Now()
    // 启动100万个线程,每个线程执行100次加1的任务,这里使用了锁,防止脏数据
    for i := 0; i < 1000000; i++ {
        // go标记的函数,自动在一个 新的线程中去执行
        go func() {
            // 控制器的执行任务+1
            wg.Add(1)
            // 子线程结束时,控制器的任务执行完成
            defer wg.Done()
            for i := 0; i < 100; i++ {
                atomic.AddInt32(&total, 1)
            }
        }()
    }
    // 这里主线程休眠一小短时间,防止子线程的任务控制wg.Add(1)还没有触发,主线程就执行完毕
    time.Sleep(1 * time.Millisecond)
    // 等待子线程的任务完成
    wg.Wait()
    // 输出最终运行时间
    log.Printf("启动100万个线程并执行计算任务完成,总计耗时:%v(毫秒)\n", time.Now().Sub(ts).Nanoseconds()/1000000)
    // 输出最终结果
    log.Println("最终计算结果为", total)
}

golang goroutine 介绍的更多相关文章

  1. golang goroutine的调度

    golang goroutine的调度 1.什么是协程? 协程是一种用户态的轻量级线程. 2.进程.线程.协程的关系和区别: * 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. ...

  2. golang goroutine

    goroutine-介绍 1)进程就是程序程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位2)线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位.3 ...

  3. 说说Golang goroutine并发那些事儿

    摘要:今天我们一起盘点一下Golang并发那些事儿. Golang.Golang.Golang 真的够浪,今天我们一起盘点一下Golang并发那些事儿,准确来说是goroutine,关于多线程并发,咱 ...

  4. golang goroutine进行通信 channel

    1.channel的读取与声明 //goroutine之间利用channel进行通信 package main import ( "fmt" "time" ) ...

  5. golang rpc介绍

    rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问.服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名.注册之后,对象的导出方法就可以被远程访问.服务端可以注册多个不 ...

  6. Golang并发编程——goroutine、channel、sync

    并发与并行 并发和并行是有区别的,并发不等于并行. 并发 两个或多个事件在同一时间不同时间间隔发生.对应在Go中,就是指多个 goroutine 在单个CPU上的交替运行. 并行 两个或者多个事件在同 ...

  7. <转>年终盘点!2017年超有价值的Golang文章

    马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍. 文章排名不分先后, 文章也不一定完全按照日期来排列.我按照文章的大致内容分了类,便于查找 ...

  8. Golang适合高并发场景的原因分析

    http://blog.csdn.NET/ghj1976/article/details/27996095 典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力. 360消息推送的数据 ...

  9. golang面向对象和interface接口

    一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...

随机推荐

  1. 常见的Dos命令

    dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. cd : 进入指定目录 cd.. : 退回到上一级目 ...

  2. Java面向对象类与对象整理

    第一章           面向对象: 1.1         什么是面向过程: 遇到某件事的时候,思考 “我该怎么做”然后一步一步实现的过程 1.2         什么是面向对象: 遇到某件事的时 ...

  3. jmeter计算身份证校验位

    idcard_no='111111198101017000' ; idcard_no_array = idcard_no.substring(0,17).toCharArray(); int[] c ...

  4. ServerU FTP服务器无法上传中文名文件怎么办

    erverU是一款非常流行的FTP服务器.最新版本的默认是utf-8编码,对中文支持不够友好,容易发生无法上传本地文件名称包含中文的文件. 工具/原料   server-u 方法/步骤     进入S ...

  5. golang 热升级

    需求场景 干净利落地升级正在运行的agent程序.适用于Devops团队. 目标: 不关闭现有连接:例如我们不希望关掉已部署的运行中的程序.但又想不受限制地随时升级服务. 新的进程要能够启动并替换掉旧 ...

  6. 2017-12-14python全栈9期第一天第六节之用户交互

    9,用户交互.input 1,等待输入, 2,将你输入的内容赋值给了前面变量. 3,input出来的数据类型全部是str 10,基础数据类型初始.数字:int 12,3,45 + - * / ** % ...

  7. 剑指Offer_编程题_5

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   class Solution { public: void push(int node) { if( ...

  8. log4j日志文件名与行号显示乱码? 问号? 参数问号? 日志问号?【转】【补】

    log4j本来设置了要打印行号与文件名的,结果有的能打印出来,有的却是乱码,查了些文档之后才发现,原来打印问题是因为编绎时没有编绎进去调试信息,所以没办法打印,好像有的系统又会显示(Unknown S ...

  9. jQuery使用(一):jQuery对象与选择器

    一.简单的一些介绍 1.jQuery是由普通的是由一些系列操作DOM节点的函数和一些其他的工具方法组成的js库. 2.为什么要使用jQuery库? jQuery面向用户良好的设计在使用过程中彻底解放了 ...

  10. uva11916 Emoogle Grid (BSGS)

    https://uva.onlinejudge.org/external/119/p11916.pdf 令m表示不能染色的格子的最大行号 设>m行时可以染k种颜色的格子数有ck个,恰好有m行时可 ...