文档章节

关于golang的协程并行的控制与示例程序

r00txx
 r00txx
发布于 2016/08/19 11:40
字数 674
阅读 254
收藏 0
Go

首先明确一个观点并行 并发区别:

并行是指程序的运行状态,要有两个线程正在执行才能算是Parallelism;并发指程序的逻辑结构,Concurrency则只要有两个以上线程还在执行过程中即可。简单地说,Parallelism要在多核或者多处理器情况下才能做到,而Concurrency则不需要。golang 利用 go func() 的方式,可以进行多个函数的并行。

我们写C 的时候,假如用到多进程,我们通常都会用信号,管理等来进程进程间的通信, 那么golang是怎么实现这个的呢?? 直接看码说话吧

package main

import (
  "fmt"
  "time"
)

func main() {
  timeout := make(chan bool, 1)
  go func() {
    fmt.Println("------------ channel 1--------------")
    t1 := time.Now().UnixNano()
    fmt.Println(t1)
    fmt.Println("这个一定会执行")
    
    time.Sleep(3 * time.Second)
    // timeout <- true
    timeout <- true
  }()
  
  fmt.Println("首先逻辑还是响应 main 函数")
  
  go func() {
    fmt.Println("------------ channel  2--------------")
    t2 := time.Now().UnixNano()
    fmt.Println(t2)
    fmt.Println("相当于fork一个子进程在进行")
  }()
  
  ch := make(chan int)
  select {
    case <-ch:
    case <-timeout:
      fmt.Println("------------ 回到main函数 --------------")
      fmt.Println("task is timeout!")
  }
  
  fmt.Println("main 函数本身的输出")
}

我们执行代码看一看结果

首先逻辑还是响应 main 函数
------------ channel 2--------------
1471577916141068800
相当于fork一个子进程在进行
------------ channel 1--------------
1471577916142068800
这个一定会执行
------------ 回到main函数 --------------
task is timeout!
main 函数本身的输出

分别从 纳秒的时间戳可以看出, 两个 go func() 几乎是同时执行的, 这种是golang并行处理的写法,  goroutine是Go语言运行库的功能,不是操作系统提供的功能,goroutine不是用线程实现的。, golang同样提供了一种监视手段去监视每个并行处理逻辑的返回, select就是这种手段

按照目前golang的机制,假如调用select的话,循环监控,假如我们注释掉 timeout <- true 这句, 看看会有什么变化, 我们再执行  go run xx.go 的时候, 会提示 fatal error: all goroutines are asleep - deadlock!,  这是可以理解为我们的 select 监控的多个并行状态都没有回调响应,所以程序一直在等待,造成死锁导致了错误。

其实golang里面也可以用 sync的  waitgroup 进行同步锁,但是这个跟协程并行似乎关系不大,有兴趣的也可以了解下

© 著作权归作者所有

r00txx
粉丝 0
博文 22
码字总数 10365
作品 0
广州
架构师
私信 提问
加载中

评论(2)

r00txx
r00txx 博主

引用来自“zlyang”的评论

哥们,这不是多进程啊。。。。golang的协程是利用线程实现的
嗯是的~~题目起得有误,谢谢指正,golang的协程确实是用特定的算法来分配线程实现的!
z
zlyang
哥们,这不是多进程啊。。。。golang的协程是利用线程实现的
Stackful 协程库--libgo

libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库。 设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第三方...

Li_Mr
2016/01/25
10.2K
6
Go中runtime.GOMAXPROCS的设置导致的性能问题

首先我们应该明确,并行和并发的区别,我之前文章中有详细的解释。概要说就是,并发一般都是被内核通过时间片或者中断来控制的,一旦遇到IO阻塞或者时间片用完,就会转移线程的使用权。单核不...

90design
2018/06/29
3K
0
python从并发、并行到协程,进程和线程的阶段总结

注:本文很多素材来源于网络上前人总结和《流畅的python》一书,本人仅仅以个人视角重新整合,便于自己理解,再此声明 并发是指一次处理多件事。 并行是指一次做多件事。 二者不同,但是有联...

Jeason_zhao
2017/07/25
0
0
k8s与监控--从telegraf改造谈golang多协程精确控制

从telegraf改造谈golang多协程精确控制 前言 telegraf是infuxdb公司开源出来的一个基于插件机制的收集metrics的项目。整个架构和elastic公司的日志收集系统极其类似,具备良好的扩展性。与现...

店家小二
2018/12/17
0
0
C++协程库--orchid

orchid是一个构建于强大的boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型。 协程,顾名思义,协作式程序,其思想是,一系列互相依赖的协程间依次使用...

江浸月
2012/12/27
3.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL参数search_path影响及作用

search_path稍微熟悉PG就会用到,用法这里就不必讲,本篇主要讲它在程序里怎样处理。 1、GUC参数定义 这是个 config_string 参数 {{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,...

有理想的猪
今天
9
0
Qt程序各个平台打包发布及安装程序大全

本文链接:https://blog.csdn.net/zhengtianzuo06/article/details/78468111 通用: 1.准备图标 图标可以直接使用一般格式的图片制作, 比如jpg, png等 推荐使用Photoshop制作原始图 推荐使用I...

shzwork
今天
12
0
springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
23
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部