编程语言-golang
文章平均质量分 52
go语言编程
一 铭
公众号:大数据架构师修行之路
展开
-
Go语言的channel和死锁
Go中channel产生的死锁阻塞(同步)channel–不带缓冲区的channel阻塞channel要点默认情况下创建的channel是阻塞和不带缓冲区的,例如:ch1 := make(chan int) // 创建一个阻塞的不带缓冲区的channel通过默认方式创建的channel有以下性质:发送操作将会阻塞,直到接收端准备好了。接收操作将会阻塞,直到发...原创 2018-07-10 22:41:33 · 1534 阅读 · 0 评论 -
Go并发编程—select的使用
概述本文描述了select的用法,通过select可以监听多个channel的读写事件。这很类似于linux系统编程的select函数。但在Go中,实现的机制明显是不同的。linux系统编程的select是轮训的机制,而且监控的是文件描述符,且有数量的限制。Go中的select和channel配合使用,监控的是channel的读写状态。select的要点select会阻塞在多个c...原创 2018-08-06 14:12:46 · 8321 阅读 · 0 评论 -
Go并发编程—sync包之Once
概述Once可以让一个动过只发生一次,不管该动作在多少个协程中执行。这种操作可以用于在多线程编程中只允许运行一次的代码块,或初始化代码块中。函数介绍func (o *Once) Do(f func())Once结构的实现// Once is an object that will perform exactly one action.type Once str...原创 2018-07-28 08:12:21 · 740 阅读 · 0 评论 -
如何用Go实现一个tcp代理服务器
概述通过linux和C/C++来实现一个代理服务器并不是那么容易,不仅要考虑内存管理和性能,还需要考虑同步和线程/进程管理等问题。为了保证性能,有时候还需要考虑和被代理的服务器保持长连接,这样就需要对链接进行管理。那么使用Go来实现一个代理服务器会如何呢?首先,通过Go来实现后台服务时至少有以下一些优势:协程可随用随起,内存管理和回收不需要自己来做。这样,再加上Go提供的一些工具函数,极大...原创 2018-07-26 21:36:05 · 7169 阅读 · 0 评论 -
Go并发编程--基于channel信号量来实现互斥锁
概述根据前面的一片文章:《Go并发编程–通过channel来实现信号量原语》我们实现了信号量的基本原语P和V操作,本章介绍如何通过P操作和V操作来实现互斥锁。实现原理当我们把channel的容量设置为1时,P和V操作就变成了,lock和unlock操作。为什么呢?我们来看下代码实现:/* mutexes */func (s semaphore) Lock() { s....原创 2018-07-15 05:54:46 · 1107 阅读 · 0 评论 -
Go并发编程--通过channel来实现信号量原语
概述信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。对于一个信号量来说,基本的操作有三个:创建一个信号量 创建一个信号量会给该信号量一个初始值,对于二元信号量来说它是1。等待(wait)一个信号量 该操作会测试这个信号量的值,如果其值小于或等于0,就等待(阻塞),一旦其值变为大于0就将它减1。 该操作也被称为P操作,或递减(down),或上锁(lock)。...原创 2018-07-15 05:24:15 · 1700 阅读 · 0 评论 -
Go并发编程--通过channel实现生产者消费者模型
概述生产者消费者模型是多线程设计的经典模型,该模型被广泛的应用到各个系统的多线程/进程模型设计中。本文介绍了Go语言中channel的特性,并通过Go语言实现了两个生产者消费者模型。channel的一些特性在Go中channel是非常重要的协程通信的手段,channel是双向的通道,通过channel可以实现协程间数据的传递,通过channel也可以实现协程间的同步(后面会有介绍)。本...原创 2018-07-14 22:56:52 · 5772 阅读 · 1 评论 -
Go并发编程--sync包来实现环形缓冲队列
概述环形缓冲区是另一个十分经典的生产者-消费者模型。其基本思想是:先开辟一块固定的内存作为保存元素(相同类型)的缓冲区,注意是一块固定的内存,开辟后大小就不能再修改了。也可以理解是一个数组。 当生产者往缓冲区中放入元素时,判断是否已经到了该队列的末尾,若到了末尾则应该,绕回到队列的首部放入元素,也就是第0个位置。 而消费者也是类似的操作(当取元素的位置到了队列最后一个,则绕回到第0个位置)...原创 2018-07-25 23:24:56 · 1447 阅读 · 0 评论 -
GO语言并发编--sync包之WaitGroup的使用
概述WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量。每个被等待的线程在结束时应调用Done方法。同时,主线程里可以调用Wait方法阻塞至所有线程结束。 但在使用时,也有一些问题需要注意,请看本文的详细分解。 另外,WaitGroup的使用场景十分有限,为什么呢?具体原因,请看本文的总结部分的分析。主要函数func (*WaitGroup)...原创 2018-07-24 23:31:32 · 15040 阅读 · 0 评论 -
Go并发编程--goroutine leak的产生和解决之道
概述在Go中,goroutine很轻量级,随便创建成千上万个goroutine不是问题,但要注意,要是这么多的goroutine一致递增,而不退出,不释放资源,就有可能耗尽系统资源。本文介绍goroutine泄露的两种实际场景,并讨论如何解决该问题。其他场景和更加详细的介绍,可以参考我的个人博客。产生原因分析产生goroutine leak(协程泄露)的原因可能有以下几种: * ...原创 2018-07-18 14:19:27 · 3263 阅读 · 1 评论 -
Go并发编程--通过channel实现流水线作业模型
概述流水线作业,是多个线程协作,就像加工车间的传送带,每个线程完成一项任务,然后把结果发送给下一个线程,直到所有线程的任务完成,一个“产品”的加工过程就完成了。 通过Go的channel,可以很方便的实现流水线作业。流水线作业的实现在linux系统编程中,一般来说流水线作业的线程数是固定的,我们模拟的这个场景,假设有几个固定的goroutine共同协作来完成一个字符串的处理,goro...原创 2018-07-11 22:01:58 · 993 阅读 · 0 评论 -
Go并发编程—pipeline模型的实现
概述本文讲述了流水线作业的另一种实现方式。这种方式完全是基于Go语言本身的特性来实现。实现说明pipeline的实现方式其实可以有多种,在C系统编程中是通过管道(pipe)来实现,但由于进程是很重量级的实体,在创建(fork)时会非常消耗系统资源,所以在linux系统编程中一般会启动固定数量的进程/线程,每个进程完成固定的工作,并通过管道进行连接,形成流水线作业(pipeline)...原创 2018-08-08 15:32:39 · 2237 阅读 · 1 评论