Go并发编程

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

常见并发模型

  • 进程 & 线程(Apache)C10K
  • 异步非阻塞(Nginx,Libevent,NodeJS) 复杂度高
  • 协程 (Golang,Erlang,Lua)

并发与并行

  • 并发:指同一时刻,系统通过调度,来回切换交替的运行多个任务,"看起来"是同时进行
  • 并行:指同一时刻,两个任务"真正的"同时进行


    图一.png

Golang并发实现

  • 程序并发执行(goroutine)
  • 多个goroutine间的数据同步和通信(channels)
  • 多个channel选择数据读取或写入(select)
Goroutine(程序并发执行)
foo() //执行函数foo,程序等待函数foo返回

go foo() //执行函数foo
bar() //不用等待foo返回
Channels(多个goroutine间的数据同步和通信)
c := make(chan string) //创建一个channel
go func() {
    time.Sleep(time.Second*1)
   c <- "hello world" //发送数据到channel中
}()
msg := <- c //阻塞直到接收到数据
Select(从多个channel中读取或写入数据)
select{
case v := <-c1:
    fmt.Println("channel 1 send",v)
case v := <-c2:
    fmt.Println("channel 2 send",v)
default: //可选
    fmt.Println("channel was ready")
}
//c1和c2同时有数据时,select随机选一个

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

本文来自:简书

感谢作者:zww007

查看原文:Go并发编程

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

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