Golang并发编程进程通信channel了解及简单使用
概念及作用
channel是一个数据类型,用于实现同步,用于两个协程之间交换数据。goroutine奉行通过通信来共享内存,而不是共享内存来通信。
引用类型channel是CSP模式的具体实现,用于多个goroutine通讯。其内部实现了同步,确保并发安全。
创建及使用
每个channel在创建的时候必须指定一个类型,指定的类型是任意的。
ch := make(chan int) //使用内置的make函数,可以创建一个channel类型
// 发送数据到channel
ch <-
// 从channel接受数据
x := <- ch
案例举例(一)
①创建channel前
package main import (
"fmt"
"time"
) //定义一个打印机,参数为字符串,按每个字符打印
//打印机属于公共资源
func Printer(str string) {
for _, data := range str {
fmt.Printf("%c", data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
} func person1() {
Printer("hello")
} func person2() {
Printer("world")
} func main() {
//新建2个协程,代表2个人,2个人同时使用打印机
go person1()
go person2() //特地不让主协程结束,死循环
for { }
}
//结果
hwoerllldo //交叉执行
②创建channel后(注意channel变量和调用的先后顺序)
package main import (
"fmt"
"time"
) //全局变量,创建一个channel
var ch = make(chan int) //定义一个打印机,参数为字符串,按每个字符打印
//打印机属于公共资源
func Printer(str string) {
for _, data := range str {
fmt.Printf("%c", data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
} //person1执行完后,才能到person2执行
func person1() {
Printer("hello")
ch <- //给管道写数据,发送
} func person2() {
<-ch //从管道取数据,接收,如果通道没有数据他就会阻塞
Printer("world")
} func main() {
//新建2个协程,代表2个人,2个人同时使用打印机
go person1()
go person2() //特地不让主协程结束,死循环
for { }
}
hello
world
案例举例(二)
package main import (
"fmt"
) func main() {
ch := make(chan string)
go func() {
fmt.Println("aaaaaaaaaa")
str := <-ch // 在执行到这一步的时候main goroutine才会停止阻塞
fmt.Println("取出channel的数据" + str)
}()
fmt.Println("bbbbbbbbbb")
ch <- "hello" // 如果没有其他goroutine来取走这个数据,main goroutine挂起,直到其它gorouteine把数据拿走(这里会暂时阻塞)
fmt.Println("cccccccccc")
}
bbbbbbbbbb
aaaaaaaaaa
取出channel的数据hello
cccccccccc
Golang并发编程进程通信channel了解及简单使用的更多相关文章
- Golang并发编程——goroutine、channel、sync
并发与并行 并发和并行是有区别的,并发不等于并行. 并发 两个或多个事件在同一时间不同时间间隔发生.对应在Go中,就是指多个 goroutine 在单个CPU上的交替运行. 并行 两个或者多个事件在同 ...
- Golang - 并发编程
目录 Golang - 并发编程 1. 并行和并发 2. go语言并发优势 3. goroutine是什么 4. 创建goroutine 5. runtime包 6. channel是什么 7. ch ...
- golang并发编程
golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止go ...
- 8.并发编程--多线程通信-wait-notify-模拟Queue
并发编程--多线程通信-wait-notify-模拟Queue 1. BlockingQueue 顾名思义,首先是一个队列,其次支持阻塞的机制:阻塞放入和获取队列中的数据. 如何实现这样一个队列: 要 ...
- 7.并发编程--多线程通信-wait-notify
并发编程--多线程通信-wait-notify 多线程通信:线程通信的目的是为了能够让线程之间相互发送信号; 1. 多线程通信: 线程通信的目的是为了能够让线程之间相互发送信号.另外,线程通信还能够使 ...
- golang并发编程goroutine+channel(一)
go语言的设计初衷除了在不影响程序性能的情况下减少复杂度,另一个目的是在当今互联网大量运算下,如何让程序的并发性能和代码可读性达到极致.go语言的并发关键词 "go" go dos ...
- Java并发编程:进程和线程的由来(转)
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
- Golang并发编程优势与核心goroutine及注意细节
Go语言为并发编程而内置的上层API基于CSP(communication sequential processes,顺序通信进程)模型.这就意味着显式锁都是可以避免的,比如资源竞争,比如多个进程同时 ...
- Python并发编程-进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
随机推荐
- Spring Boot下的lombok安装以及使用简介
引言:lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用. 1. Lombok lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java ...
- Python 全栈开发七 面向对象
一.编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式 ...
- bat脚本简单命令
1.if 判断 (1.1)判断字符串是否为空: if "%var1%" == " " ( echo null) else(echo not null ) (1. ...
- MySQL--10MySQL图形化管理工具
- JavaScriptSerializer的日期转换方案
1.转换后过滤替换(通用) /// <summary> /// 日期转换 /// </summary> /// <param name="str"&g ...
- JavaScript-模拟收银台小程序
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- django 静态css js文件配置
参考:http://blog.csdn.net/liqiancao/article/details/66151287
- Rpgmakermv(16) YEP MainmenuManager
---------------------------------------------------------------------------------------------------- ...
- hdu4784
题意: 给了一个图 从1号节点走到N号节点,然后,每个地方有买卖盐的差价,然后求 到达N的最大价值,一旦走到N这个点就不能再走了,或者走到不能再别的世界走1和N这两个点,然后接下来 用一个 四维的数组 ...
- MVC 中的Model对象
最近实在是太忙,客户丢了一个框架,没有任何说明文档,更没有所谓的技术支持,一直忙于学习,最后好歹还有点头绪,话不多说,MVC的学习是不能拉下的,就当前小白的我,认为MVC中的M并不是想象中的那样简单, ...