Golang中信号处理

什么是信号?

信号(signal)是进程间通讯的一种方式,用来提醒进程某个事件已经发生。它属于一种异步通知进制。一个进程不必通过任何操作来等待信号的到达,事实上进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

阅读更多

Golang并发调度的GMP模型

Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务,将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。

什么是Goroutine

Goroutine = Golang + Coroutine。Goroutine是golang实现的协程,是用户级线程。Goroutine具有以下特点:

  • 相比线程,其启动的代价很小,以很小栈空间启动(2Kb左右)
  • 能够动态地伸缩栈的大小,最大可以支持到Gb级别
  • 工作在用户态,切换成很小
  • 与线程关系是n:m,即可以在n个系统线程上多工调度m个Goroutine

阅读更多

Golang源码分析系列之官方Context包

Context简介

Context是由Golang官方开发的并发控制包,一方面可以用于当请求超时或者取消时候,相关的goroutine马上退出释放资源,另一方面Context本身含义就是上下文,其可以在多个goroutine或者多个处理函数之间传递共享的信息。

创建一个新的context,必须基于一个父context,新的context又可以作为其他context的父context。所有context在一起构造成一个context树。

context tree

阅读更多

Golang设计模式系列之工厂方法模式

定义

工厂方法模式(Factory Method Pattern)也称为工厂模式(Factory Pattern)。同简单工厂模式一样,工厂方法模式也是一种创建型设计模式。不同于简单工厂模式的都是通过同一个具体类(类的静态方法)或者函数来创建对象,工厂方法模式是通过一系列实现创建对象接口的具体子类来创建对象。即:

工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

阅读更多

Raft:一种分布式一致性算法

什么是分布式一致性

分布式一致性(Distributed Consensus)简单来说就是在多个节点组成系统中各个节点的数据保持一致,并且可以承受某些节点数据不一致或操作失败造成的影响。分布式一致性是分布式系统的基石。

阅读更多

《深入理解程序设计》读书笔记

计算机体系结构

冯诺依曼体系

冯诺依曼计算机体系

当前计算机主要是基于冯诺依曼体系结构设计的,主要由五大部件组成:

  1. 存储器用来存放数据和程序

  2. 运算器主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中

  3. 控制器主要用来控制和指挥程序和数据的输入运行,以及处理运算结果

  4. 输入设备用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等

  5. 输出设备可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等

阅读更多

Golang设计模式系列之简单工厂模式

定义

简单工厂模式是一种创建型设计模式,一般又称为静态工厂方法(Static Factory Method)模式。这种模式通过一个静态方法或者函数来达到隐藏正在创建的实例的创建逻辑目的

客户端仅与工厂方法交互,并告知需要创建的实例类型。工厂方法与相应的具体产品进行交互,并返回正确的产品实例。

阅读更多

深入了解golang中的defer关键字

golang中的defer关键字是用来声明一个延迟函数,一般称这个函数为defer函数,该函数会在defer语句所在的函数返回之前会执行。通过defer关键字,我们可以修改函数命名返回值,进行资源释放等操作,总的来说defer函数有如下特点和功能:

  • 函数返回之前执行
  • 可以放在函数中任意位置
  • 可以同时设置多个defer函数,多个defer函数执行遵循FILO顺序
  • defer函数的传入参数在定义时就已经明确
  • 可以修改函数中的命名返回值
  • 用于文件资源,锁资源、数据库连接等释放和关闭
  • 和recover一起处理panic

本文将介绍defer上面的几个特性,如果想深入了解defer底层实现机制,可以阅读笔者写的《深入Go语言之旅 - 基础篇 - defer函数》

defer会在函数返回之前执行

当程序执行一个函数时候,会将函数的上下文(输入参数,返回值,输出参数等信息)作为栈帧放在程序内存的栈中,当函数执行完成之后,设置返回值并返回,此函数才真正完成执行。

defer语句函数会在函数返回之前执行,下面程序将会依次输出B A:

1
2
3
4
func main() {
defer fmt.Println("A")
fmt.Println("B")
}

阅读更多

Golang设计模式系列开篇

抽象是用来处理复杂性的主要工具。一个问题越复杂,就越需要抽象来解决

概念

设计模式这个术语是由Erich Gamma等人在1990年代从建筑设计领域引入到计算机科学的。在《Domain-Driven Terms》一书中,设计模式被描述为:

设计模式是命名、抽象和识别对可重用的面向对象设计有用的的通用设计结构。设计模式确定类和他们的实体、他们的角色和协作、还有他们的责任分配

每一个设计模式都聚焦于一个面向对象的设计难题或问题。它描述了在其它设计的约束下它能否使用,使用它后的后果和得失

阅读更多