go语言上下文Context
本文章转载自 draveness1.1 上下文 Context上下文 context.Context Go 语言中用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与 Goroutine 有比较密切的关系,是 Go 语言中独特的设计,在其他编程语言中我们很少见到类似的概念。
context.Context 是 Go 语言在 1.7 版本中引入标准库的接口1,该接口定义了四个需要实现的方法,其中包括:
Deadline — 返回 context.Context 被取消的时间,也就是完成工作的截止日期;
Done — 返回一个 Channel,这个 Channel 会在当前工作完成或者上下文被取消后关闭,多次调用 Done 方法会返回同一个 Channel;
Err — 返回 context.Context 结束的原因,它只会在 Done 方法对应的 Channel 关闭时返回非空的值;
如果 context.Context 被取消,会返回 Canceled 错误;
如果 context.Context 超时,会返回 DeadlineExceeded 错误;
Valu ...
go语言插件系统
本文章转载自 draveness8.1 插件系统熟悉 Go 语言的开发者一般都非常了解 Goroutine 和 Channel 的原理,包括如何设计基于 CSP 模型的应用程序,但是 Go 语言的插件系统是很少有人了解的模块,通过插件系统,我们可以在运行时加载动态库实现一些比较有趣的功能。
8.1.1 设计原理Go 语言的插件系统基于 C 语言动态库实现的,所以它也继承了 C 语言动态库的优点和缺点,我们在本节中会对比 Linux 中的静态库和动态库,分析它们各自的特点和优势。
静态库或者静态链接库是由编译期决定的程序、外部函数和变量构成的,编译器或者链接器会将程序和变量等内容拷贝到目标的应用并生成一个独立的可执行对象文件1;动态库或者共享对象可以在多个可执行文件之间共享,程序使用的模块会在运行时从共享对象中加载,而不是在编译程序时打包成独立的可执行文件2;由于特性不同,静态库和动态库的优缺点也比较明显;只依赖静态库并且通过静态链接生成的二进制文件因为包含了全部的依赖,所以能够独立执行,但是编译的结果也比较大;而动态库可以在多个可执行文件之间共享,可以减少内存的占用,其链接的过程往往 ...
Golang Mutex源码分析
Golang Mutex源码分析Golang 中的Mutex 主要借助了 CAS 指令 + 自旋 + 信号量
CAS 指令比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。 该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值。
CAS 缺点
CAS在共享资源竞争比较激烈的时候,每个goroutine会容易处于自旋状态,影响效率,在竞争激烈的时候推荐使用锁。
无法解决ABA问题
ABA问题
进程P1读取了一个数值AP1被挂起(时间片耗尽、中断等),进程P2开始执行P2修改数值A为数值B,然后又修改回AP1被唤醒,比较后发现数值A没有变化,程序继续执行。
自旋是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。
信号量信号量的概念是计算机科学家 Dijkstra (Dijkstra算法的发明者)提出来的 ...
Golang sync 包分析
第一章 Golang sync 包的相关使用方法一、锁的基本概念及使用整个包都是实现Locker接口
type Locker interface{ Lock() UnLock()}
该接口只有两个方法,Lock() 和UnLock() 。注意:该包下的对象时候过后不可进行复制
为什么需要锁?首先,我们都知道在并发 的情况下,多线程或者协程同时修改一个变量的时候时,可能会出现如下情况:
package mainimport ( "fmt" "sync" "time")func main() { var a = 0 // 启动 100 个协程,需要足够大 // var lock sync.Mutex for i := 0; i < 100; i++ { go func(idx int) { // lock.Lock() // defer lock.Unlock() ...
go语言GMP模型分析
Golang 调度器GMP原理分析Golang调度器来源单进程时代不需要调度器我们都知道,一切的软件都是跑在操作系统上。然而真正干活的其实是CPU。早期的操作系统每个程序就是一个进程,直到一个程序结束,才能进行下一个进程。这就是“单进程时代”。
早期的单进程操作系统,面临 2 个问题:
单一的执行流程,计算机只能一个任务一个任务处理。
进程阻塞所带来的 CPU 时间浪费。
那么能不能有多个进程来宏观一起来执行多个任务呢?
后来操作系统就具有了最早的并发能力:**多进程并发,当一个进程阻塞的时候,切换到另外等待执行的进程 **,这样就能尽量把 CPU 利用起来,CPU 就不浪费了。
多进程/线程时代有了调度器的需求
在多进程 / 多线程的操作系统中,就解决了阻塞的问题,因为一个进程阻塞 cpu 可以立刻切换到其他进程中去执行,而且调度 cpu 的算法可以保证在运行的进程都可以被分配到 cpu 的运行时间片。这样从宏观来看,似乎多个进程是在同时被运行。
但新的问题就又出现了,进程拥有太多的资源,进程的创建、切换、销毁,都会占用很长的时间,CPU 虽然利用起来了,但如果进程过多,C ...
CDC_Architecture_Analysis
CDC整体架构分析CDC 概览
CDC流程图
Range Feed原理分析RangeFeed数据来源下图中的步骤③当raft group leader 将raft log apply到状态机时,将raftCommand中对应的数据变更publish出来RangeFeed捕获变更数据流程Feed结构分析
The Difficulty With Decoding WriteBatchesMVCC操作对应的WriteBatch包含的entries
- MVCCPut - inline (never transactional) + write meta key w/ inline value - not inline - transactional - no + write new version - yes ...
Hexo-Theme-Sakura
hexo-theme-sakura主题 English document
基于WordPress主题Sakura修改成Hexo的主题。
demo预览
正在开发中……
交流群若你是使用者,加群QQ: 801511924
若你是创作者,加群QQ: 194472590
主题特性
首页大屏视频
首页随机封面
图片懒加载
valine评论
fancy-box相册
pjax支持,音乐不间断
aplayer音乐播放器
多级导航菜单(按现在大部分hexo主题来说,这也算是个特性了)
赞赏作者如果喜欢hexo-theme-sakura主题,可以考虑资助一下哦~非常感激!
paypal | Alipay 支付宝 | WeChat Pay 微信支付
未完善的使用教程那啥?老实说我目前也不是很有条理233333333~
1、主题下载安装hexo-theme-sakura建议下载压缩包格式,因为除了主题内容还有些source的配置对新手来说比较太麻烦,直接下载解压就省去这些麻烦咯。
下载好后解压到博客根目录(不是主题目录哦,重复的选择替换)。接着在命令行(cmd、bash)运行npm i安装依赖。
2、主题 ...