go语言信号 go语言信号抢占( 三 )


4、组合的思想、无侵入式的接口
Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持 。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程 。
5、强大的标准库
这包括互联网应用、系统编程和网络编程 。Go里面的标准库基本上已经是非常稳定,特别是我这里提到的三个,网络层、系统层的库非常实用 。
6、部署方便
我相信这一点是很多人选择Go的最大理由,因为部署太方便,所以现在也有很多人用Go开发运维程序 。
7、简单的并发
它包含降低心智的并发和简易的数据同步 , 我觉得这是Go最大的特色 。之所以写正确的并发、容错和可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象,Go可以说这一块做的相当简单 。
8、稳定性
Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切 。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期的各个环节的工具,如go
tool、gofmt、go test 。
golang之context详解为什么需要context
在go服务器中,对于每个请求的request都是在单独的goroutine中进行的,处理一个request也可能设计多个goroutine之间的交互 ,  使用context可以使开发者方便的在这些goroutine里传递request相关的数据、取消goroutine的signal或截止日期
在并发程序中,由于超时、取消操作或者一些异常情况 , 往往需要进行抢占操作或者中断后续操作 。熟悉channel的朋友应该都见过使用done channel来处理此类问题 。比如以下这个例子:
上述例子中定义了一个buffer为0的channel done, 子协程运行着定时任务 。如果主协程需要在某个时刻发送消息通知子协程中断任务退出,那么就可以让子协程监听这个done channel,一旦主协程关闭done channel,那么子协程就可以推出了 , 这样就实现了主协程通知子协程的需求 。这很好,但是这也是有限的 。
如果我们可以在简单的通知上附加传递额外的信息来控制取消:为什么取消,或者有一个它必须要完成的最终期限 , 更或者有多个取消选项,我们需要根据额外的信息来判断选择执行哪个取消选项 。
考虑下面这种情况:假如主协程中有多个任务1, 2, …m,主协程对这些任务有超时控制;而其中任务1又有多个子任务1, 2, …n,任务1对这些子任务也有自己的超时控制 , 那么这些子任务既要感知主协程的取消信号,也需要感知任务1的取消信号 。
如果还是使用done channel的用法,我们需要定义两个done channel,子任务们需要同时监听这两个done channel 。嗯,这样其实好像也还行哈 。但是如果层级更深,如果这些子任务还有子任务 , 那么使用done channel的方式将会变得非常繁琐且混乱 。
我们需要一种优雅的方案来实现这样一种机制:
上层任务取消后 , 所有的下层任务都会被取消;中间某一层的任务取消后,只会将当前任务的下层任务取消 , 而不会影响上层的任务以及同级任务 。
这个时候context就派上用场了 。我们首先看看context的结构设计和实现原理 。
context接口
先看Context接口结构,看起来非常简单 。
}
Context接口包含四个方法:
Deadline返回绑定当前context的任务被取消的截止时间;如果没有设定期限 , 将返回ok == false 。
Done 当绑定当前context的任务被取消时,将返回一个关闭的channel;如果当前context不会被取消,将返回nil 。

推荐阅读