聊聊并发,进程通信方式,go协程简单应用场景
开篇提问
- 知道并发,并行,线程,协程概念吗?或者知道大概含义吗?
- 有线程为什么还要有协程?区别是什么?
- 『进程』通信方式知道几种?有没有超过3种?
- golang『协程』通信方式推荐?
- 使用并发的目的是为什么?是能帮我们解决什么问题吗?
概念
并发,线程,协程:概念是不可能概念的,google去吧。或者点击这里,查看上一篇文章
- 并行:一般是指多个CPU实例或者多台机器在『同一时刻』同时执行某个逻辑(方法)
『进程』通信方式
| 名称 | 特点 |
|---|---|
| 管道/匿名管道(pipe) | 管道的实质是一个内核缓冲区 |
| 有名管道(FIFO) | 先进先出(first in first out); 以有名管道的文件形式存在于文件系统中; |
| 信号(Signal) | 无需知道该进程的状态; 阻塞进程; 异步通信; |
| 消息队列(Message Queue) | 放在内核中的消息链表; 允许一个或多个进程向它写入与读取消息; 克服了信号承载信息量少缺陷; 目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,系统V消息队列目前被大量使用; |
| 共享内存(share memory) | 使得多个进程可以可以直接读写同一块内存空间,是最快的可用IPC形式; 由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥; |
| 信号量(semaphore) | 信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步只能通过两个标准原子操作:wait(semap) , signal(semap) ;进行访问 信号量是非负整型变量 操作也被成为PV原语(P来源于荷兰语proberen"测试",V来源于荷兰语verhogen"增加",P表示通过的意思,V表示释放的意思) |
| 套接字(socket) | 套接字是支持TCP/IP的网络通信的基本操作单元 套接字的特性由3个属性确定,它们分别是:域、端口号、协议类型。 |
信号量与互斥量之间的区别:
(1)互斥量用于线程的互斥,信号量用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
(2)互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。
(3)互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
go协程通讯使用
基本上就是推荐使用channel,这个是最推荐的使用形式;
还有就是使用sync.Mutex互斥锁进行加锁通讯;
更详细的介绍以后写;
go使用协程一些应用场景,简单举例
- 进行互不相干的『循环』,需要等待结果计算
这种情况下,一般是不同『数据集合』需要进行『处理』,在处理的过程中两个数据集合对『结果』造成的影响没有时序行;
这种情况下,完全可以采用两个数据单独进行协程处理然后再进行后续运算;
// 伪代码
var result, data1, data2 int32
done1 := make(chan bool)
done2 := make(chan bool)
// 第一个数据集合,需要求和
go func() {
for _, val := range dataset1 {
data1 += val
}
done1 <- true
}
// 第二个数据集合,需要求和
go func() {
for _, val := range dataset2 {
data2 += val
}
done2 <- true
}
// 等待协程完成运算
<-done1
<-done2
// 结果进行相加
result = data1 + data2
- 需要额外进其他不相干的业务,不耽误『主协程』的返回值,不等待
一般有些业务处理以后,有些『额外工作』需要处理但是不耽误主协程返回数据,这个时候就可以开个协程去做,不用等待
// 伪代码
result, err := processMethod()
if err != nil {
.....
}
// 需要对结果进行写缓存等其他操作,不耽误数据返回
go func() {
err = saveRedis(result)
if err != nil {
.....
}
}
return result
- 对某些任务进行时间限制,『超时关闭』当前操作
例如,通过管道channel发送某些数据,若超时则自动放弃本次发送,关闭通道。
// 定义两个有缓冲通道,容量分别为1
c1 := make(chan string, 1)
c2 := make(chan string, 1)
go func() {
time.Sleep(time.Second * 1) // 隔1秒发送数据
c1 <- "data1"
}()
go func() {
time.Sleep(time.Second * 6) // 隔6秒发送数据
c2 <- "data2"
}()
for i := 0; i < 2; i++ {
// 给通道创建容忍时间,如果5s内无法读写,就即刻返回
tm := time.NewTimer(time.Second * 5)
// 使用select来获取这两个通道的值,然后输出
select {
case data1 := <-c1: // 接收c1通道数据(消费数据)
fmt.Println(msg1)
case data2 := <-c2: // 接收c2通道数据(消费数据)
fmt.Println(msg2)
case <-tm.C:
fmt.Println("timeout!")
}
}
篇末提问
- 使用过协程吗?知道协程与线程的区别吗?
- 如果是单核CPU,开协程会有用吗?
- 本文由于没有帮助你提升code能力?
- 进程通讯方式有没有一点点了解?
- 你会使用本文的协程案例提升运行速度吗?
聊聊并发,进程通信方式,go协程简单应用场景的更多相关文章
- python并发编程之gevent协程(四)
协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块.由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成. 系列文章 python并发编程 ...
- python并发编程之线程/协程
python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...
- python任务执行之线程,进程,与协程
一.线程 线程为程序中执行任务的最小单元,由Threading模块提供了相关操作,线程适合于IO操作密集的情况下使用 #!/usr/bin/env python # -*- coding:utf-8 ...
- Python 线程池,进程池,协程,和其他
本节内容 线程池 进程池 协程 try异常处理 IO多路复用 线程的继承调用 1.线程池 线程池帮助你来管理线程,不再需要每个任务都创建一个线程进行处理任务. 任务需要执行时,会从线程池申请线程,有则 ...
- python并发编程之asyncio协程(三)
协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ...
- Python并发编程——多线程与协程
Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...
- Lua 5.3 协程简单示例
Lua 5.3 协程简单示例 来源 http://blog.csdn.net/vermilliontear/article/details/50547852 生产者->过滤器->消费者 模 ...
- python之进程,线程,协程简单理解
进程:资源单位,由操作系统控制调度.正在执行的一个程序或者过程,进程之间不共享资源,进程间通讯手段:管道,队列,信号量等.多用于计算密集型场景,如金融计算 线程:是cpu的最小执行单位,由操作系统控制 ...
- Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)
一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...
随机推荐
- 第四章 、PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 前面章节其实已经在使用信号和槽了,但是作为Qt中最重要的机制也是Qt区别与其他开发平台的重 ...
- git 常用命令 command 1.0(本地 local repository 对远程仓库 remote repository 的操作)
输入 q 退出 日志界面
- IntelliJ IDEA2019.3.2破解/永久激活/安装教程
我想大家用过史上最好的开发工具就是idea了,没有之一!看到大家都在找idea的激活教程,今天我也在这里跟大家分享一下. 本教程针对现在官网针对的版本是idea2019.3.2,为防止以后会更新破解失 ...
- 查询满足条件的最新数据(逐步优化,mysql、达梦数据库)
1.条件:报警信息表sensor_warning 2.需求: 查询当前车厢的.不同设备的.所有处理未完成的.不同报警原因的.时间最新的数据集合,最后按设备id或报警时间排序 3.原始sql,不满足实际 ...
- AtCoder Grand Contest 017 (VP)
contest link Official Editorial 比赛体验--之前做题的时候感觉 AtCoder 挺快的,现在打了VP之后发现还是会挂的--而且不是加载缓慢或者载不出来,直接给你一个无法 ...
- BJOI2017 喷式水战改
题目链接. Description 维护一个序列,支持操作: 每次在 \(P_i\) 位置后插入一段 \(X_i\) 单位的燃料,这一段有三个模式,对应的能量分别是 \(A_i, B_i, C_i\) ...
- 五、git学习之——分支管理策略、Bug分支、feature分支、多人协作
一.分支管理策略 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生 ...
- 一、java多线程编程核心技术之(笔记)——多线程的实现
概念:可以理解为在进程中独立运行的子任务.比如,QQ.exe在运行时就有很多子任务在运行,好友视屏线程,下载文件线程,传输数据线程等等. 优点:1.提升CPU资源利用率,提升系统性能. 一.多线程的实 ...
- git 远端版本回退
情景:本地更改推送远端后,想要回退到自己推送之前的某个版本. 比如想回退的分支为 test 分支. 风险:远端回退到某一版本后,之后的所有推送都没了(对应的日志记录也没了).如果是团队开发,不仅自己推 ...
- 廖雪峰官网学习js 数组
indexOf( ) 某字符的位置 slice 相当于string 的substring 切片 a = ['a','b',1,2,3] (5) ["a", "b&q ...