Golang中怎么实现并发编程
这期内容当中小编将会给大家带来有关Golang 中怎么实现并发编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、网站制作、永新网络推广、小程序设计、永新网络营销、永新企业策划、永新品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供永新建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
关于进程、线程和协程的区别
进程是“程序执行的一个实例” ,担当分配系统资源的实体。进程创建必须分配一个完整的独立地址空间。进程切换只发生在内核态。
线程:线程是进程的一个执行流,独立执行它自己的程序代码,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程。
协程:协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。在语言级别可以创建并发协程,然后编写代码去进行管理。Go 将这一步承包下来,使协程并发运行成本更低。
Go 实现最简单的并发
for i := 0; i < 10; i++ { go func(n int) { fmt.Println(n) }(i) }
项目实践
最近有个项目需要同时调用多个 job,并要等待这些 job 完成之后才能往下执行。
串行执行 job
最开始,我们拥有一个执行 job 的方法,并且串行执行所有的 job:
func buildJob(name string) { ... } buildJob("A") buildJob("B") buildJob("C")
并行执行 job
因为所有 job 是可以并发执行的,这样就不用必须等待上一个 job 执行完成后,才能继续执行其他 job。我们可以使用 Go 语言的关键字 go
来快速启用一个 goroutine
,下面我们将并发地执行三个 job:
go buildJob("A") go buildJob("B") go buildJob("C")
等待所有 job 完成
怎样才能知道每个 job 是否已经完成,这里可以使用 channel
进行通信,并使用 select
检查执行结果:
func buildJob(ch chan error, name string) { var err error ... // build job ch <- err // finnaly, send the result into channel } func build() error { jobCount := 3 errCh := make(err chan error, jobCount) defer close(errCh) // 关闭 channel go buildJob(errCh, "A") go buildJob(errCh, "B") go buildJob(errCh, "C") for { select { case err := <-ch: if err != nil { return err } } jobCount-- if jobCount <= 0 { break } } return nil }
发现问题
当 job A 执行失败时,build
方法会 return err
退出,并执行 close(errCh)
。可是此时另外两个 job B 和 C 可能还没执行完成,同时也会把结果发给 errCh
,但由于这个时候 errCh
已经被关闭了,会导致程序退出 panic: send on closed channel
。
优化代码
在给 channel 发送数据的时候,可以使用接收数据的第二个值判断 channel 是否关闭:
func buildJob(ch chan error, name string) { var err error ... // build job if _, ok := <-ch; !ok { return } ch <- err // finnaly, send the result into channel } func build() error { jobCount := 3 errCh := make(err chan error, jobCount) defer close(errCh) // 关闭 channel go buildJob(errCh, "A") go buildJob(errCh, "B") go buildJob(errCh, "C") for { select { case err := <-ch: if err != nil { return err } } jobCount-- if jobCount <= 0 { break } } return nil }
上述就是小编为大家分享的Golang 中怎么实现并发编程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。
网页题目:Golang中怎么实现并发编程
标题URL:http://hbruida.cn/article/gsejde.html