Go并发编程之二

一、前言

前一篇 Go并发编程之一 主要介绍了如何通过go语句启动协程(goroutine)以及协程调度的不确定性,这一篇我们重点来介绍一下协程中另外一个重要概念channel,记住第一句话:

goroutine之间不是通过共享内存来通信,而是通过通信来共享内存。

二、通道channel

1、创建通道

ch := make(chan string)

注:这里创建的是无缓存通道,这一节我们也只讲无缓存通道。创建通道时是需要指定通道的数据类型。

2、向通道发送数据

ch <- data

3、从通道接收数据

data := <-ch

注:这个语法有点不好写,可以理解为箭头往那边去就是往那里写数据,类似于Linux的文件重定向语法。

记住第二句话:

**同一时刻只能有一个goroutine能向通道发送数据,也只能有一个goroutine从这个通道接收数据。**这就彻底保证了通道的数据是goroutine安全的,而其它编程语言中共享内存是需要加锁来保证数据安全。

理论的东东不多讲,我讲出来可能也不一定严谨,先来看一个例子。

三、例子

注:这个例子来源于Microsoft,写得很好直接搬过来用了,Go是Google搞的,但微软有很好Go语言入门培训文档 (https://docs.microsoft.com/zh-cn/learn/paths/go-first-steps/),关键还是中文的。不太谦虚地讲,他的文档写得比我好100倍,如果谦虚地讲。。。。。

通道可以做为函数参数,这样在子goroutine里就可以向通道发送数据,然后在主goroutine里就可以从通道中取出执行结果数据,这里启动了6个协程去请求URL,然后因为通道一个重要的特性:如果通道数据没有接收,发送方会被阻塞,这样就会等6个协程都执行完数据被接收后,主流程才会往后执行。

做业务系统开发碰到关于多线程最多的就是处理大量数据,如果在Java或Python中要多线程处理数据,代码就会写得很复杂,而用Go代码是如此简洁。

相关推荐
依然鸣14 分钟前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
IT_陈寒1 小时前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端
小强库计算机毕业设计2 小时前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
小狼1832 小时前
实践6|SDD 实战:AI 写的规格被推翻了四次
后端·claude
篮框坏了2 小时前
"DeepSeek Harness 实测:一毛钱干三活,但默认配置是个坑"
后端·ai编程
jobBridge212 小时前
大模型到底是怎么"想"的?我把 Transformer 拆开,发现它其实是个"接词狂魔"
人工智能·后端·编程语言
库玛西2 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
liulilittle2 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
唐青枫3 小时前
看懂内存地址之后,才算真正入门 Zig:指针、切片与实战
后端
朋克洛德的码农3 小时前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang