原文链接:Concurrency Trap #2: Incomplete Work (ardanlabs.com) 简介 在我的上一篇博文[译]Goroutine Leaks - The Forgotten Sender中,我提到了并发是一个非常有用的工具,但是并发往往伴随着特定的陷阱,而这些不会在同步编程中出现。本文会继续这个主题,在本文中我将介绍一个名为未完成的工作的陷阱。未完成的工作发生于在仍然有未完成的Goroutine(非main goroutine)存在的时候程序终止退出了。发生这种情况时,Goroutine的本质使得它会被强制退出,这可能是一个严重的问题。 未完成的工作 为了说明什么是未完成的工作,请观察下面的例子。 …
阅读更多Dave Cheney 2019年在QCon上分享的一些Go编程的原则很有参考价值。我摘录了关于并发的部分,这部分是关于Go编发编程的一些原则和思想。 原文链接:Practical Go: Real world advice for writing maintainable Go programs (cheney.net) 通常选择Go来做项目,往往是因为它的并发特性。Go团队已经不遗余力的让Go在并发方面即能节省资源又能满足性能要求。然而,使用Go的并发特性写出低性能或者不稳定的代码是完全可能的。在最后我想留给你们一些我关于如何避免使用Go并发特定带来的一些隐患的建议。 支持并发特性的语句channel,select和go在Go特 …
阅读更多原文链接:Goroutine Leaks - The Forgotten Sender (ardanlabs.com) 简介 并发编程可以让程序员以多个执行路径来解决问题,而且通常是试图提高程序性能。并发并不意味着这些执行路径是以并行的方式执行,而是说这些执行路径以无序异步的方式执行而不是同步顺序执行。历史上这种编程模型是通过标准款或者第三方库来实现的。 Go语言中,并发特性是通过语言内置的Goroutine和channel来实现,这样就减少了对库的依赖。这容易给人一种错觉,觉得使用Go来编写并发程序会很简单。你得非常小心,因为如果你没有正确的使用Go的并发特性,往往会引入特定的边界效应或者调入陷阱。一不小心,这些陷阱就会给你程序带 …
阅读更多本文通过一些列的步骤,来介绍一下如何通过Github Pages和Hugo来搭建一个个人博客。 说明 首先需要你要有一个github账号。我的一个思路是:把markdown源文件放在一个私有的repo下,然后通过hugo build出来的静态html放在另一个公开的repo下,这个过程可以通过Github Action来触发。基于此,我的博客源文件是在私有repo jonlimx/blogs-src里,博客本身是在公开repo jonlimx/blogs下,如下图所示: 所以,如果你想跟我一样,你需要事先建好一个私有repo和一个公开repo。下文中提到的jonlimx/blogs-src就是特指我的私 …
阅读更多