最近有一个机会了解了一下仰慕已久的 GO,将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,大力支持网络通信、并发和并行编程的,GO 确实很多方便做的不错,虽然在国内一直是不温不火的状态,哈哈~
这次使用的最初原因是在 ROR 中,需要发送大量 header 请求到第三方,在 worker 里面做,每 1k 请求耗时大概 2-3mins,几个 worker 还是有点浪费资源。GO 这个时候真的是体现了自己大 BOSS 的价值。GO 的 concurrency 的特性,可以实现 1k 个请求 1.5mins。一方面速度很快,当然另外一方面,实现起来也比 ROR 里面笨重的 worker 好很多。但是提到 concurrency,大多数小伙伴会想到 parallelism,但是其实还是完全不同的二个东西。
concurrency 是通过将一个大任务,切成可以单独运行的小块,并且让这些小的代码快很好的沟通的过程。而 parallelism 是同时执行计算的过程。看图:
既然是 concurrency,那么 Go Scheduler 是如何管理所有的 go routine 来提高速度呢?看图:
当正在运行的 go routine 被 block,比如正在发送第三方请求,那么 Scheduler 会重新选择一个新的 go routine,继续运行,不会让 CPU 闲置。正是因为 go 这样灵巧的管理机制,才可以让 CPU 到达了最大的利用率,从而节约时间。 另外再把 goroutine 和 channel 结合使用,即可达到预想的效果了!(字迹很丑,请多包含!)