我为什么错怪了goroutine

2024-02-08 00:20
文章标签 goroutine 错怪

本文主要是介绍我为什么错怪了goroutine,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前段时间写了篇随笔:
我错怪了goroutine
有点长,本文缩一下。

我并不懂golang,只会照猫画虎,我一直以为goroutine是比thread更轻量的执行体,系统开销依然会随着goroutine的数量而线性增加,在大并发场景显然存在扩展性问题,但其实并不是。

下图解释:
在这里插入图片描述
左上角是传统方式,有扩展性问题,右上角是异步方式,epoll收事件,loop处理,这是大家都认可的方式,下面是goroutine方式,和异步方式差异是不用自己loop事件,runtime帮调度,没有系统开销,为啥就觉得它会跟传统方式一样呢?

如果不用routine这个词,或者至少不翻译成“X程”,拿它和thread,process对比的动机就降低了,runtime对goroutine的调度也别叫“调度”,而称“分发”,我想会好很多。

好了,以上就是关于我错怪了goroutine的原因总结。下面的内容是今天和一位朋友聊到的一些想法,不属于本文的主体。

一位朋友提到协程池是开历史倒车,我表示认同。仅就goroutine池化而言,我想是对goroutine误解的产物,goroutine池化显然是对runtime的不信任,所以试图自己控制goroutine数量从而降低调度开销。如果真是想榨取被runtime的方便性而夺去的那一丢丢性能,干嘛不用C呢。使用golang,图的就是方便,那必然要用一些性能来换,幸运的是,并不贵,只需一点点性能损耗。

并不存在线性递增的调度开销。

因为我不懂golang,所以我一开始觉得one goroutine per conn会有扩展性问题,简单了解goroutine原理后,我发现这反而是优势。用写线程的思维去写goroutine,很容易写出协程池这种东西。也因为我不懂golang,我才能迅速领悟goroutine的真实。

总之,如果用golang,就把一切交给runtime吧,它能hold住大多数场景,剩下的如果需要极致,那就用C。C刚流行的时候,肯定也有人以优化为由将它写成汇编的形式,大量用goto,拒绝函数调用。

优化是万恶之源,历史只会不断重演。

我越来越觉得goroutine好,它把手写event loop转换成了goroutine的调度,这才是真正的“编程者只关注业务逻辑”而不必再了解框架,只需要在函数前面写一个go即可。这太棒了,写一篇随感。

浙江温州皮鞋湿,下雨进水不会胖。

这篇关于我为什么错怪了goroutine的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689387

相关文章

golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取、单元测试

goroute初识channel存取开启goroute实现chan之间的同步存取channel关闭range 单元测试 goroute初识 package mainimport ("fmt"// "os""time")func test(){var i int for {fmt.Println(i)time.Sleep(time.Second)i++}}func

4-golang协程(goroutine)和管道(channel)

4-golang协程(goroutine)和管道(channel) 1. 并发和并行 多线程程序在单核上运行,就是并发 多线程程序在多核上运行,就是并行 2. go协程和线程 Go主线程(也可以称为线程,可以理解为进程):一个Go线程上可以起多个协程,协程是轻量级的线程Go协程的特点 有独立的栈空间共享程序堆空间调度由用户控制协程是轻量级的线程 func test() {for i

二十四、goroutine

目录 一、并发与并行 二、阻塞与非阻塞 1、模拟一个阻塞方法  2、使用goroutine进行并发处理 三、关于goroutine的性能 一、并发与并行 理解:举个通俗的例子来理解两者之间的区别,在自己家同时制作多个蛋糕叫并发,与朋友家一起制作,制作完成后汇集在一起叫做并行。 二、阻塞与非阻塞 1、模拟一个阻塞方法 import ("fmt""time")fu

从零基础学Go(九)——Go的Goroutine

简介📃 Go语言(简称Go)是由谷歌公司开发的一种静态强类型、编译型、并发型的编程语言。Go语言的一个显著特点就是对并发编程的良好支持,而Goroutine则是实现这一特性的重要基础。Goroutine可以看作是Go语言中的轻量级线程,它可以帮助开发者轻松实现并发任务,从而更高效地利用多核处理器的能力。 关于计算机中的并发相关知识基础同学们可以参考我的上一期文章 全栈杂谈第一期:什么是计算机

Golang计算单个Goroutine占用内存

一直在想单个Goroutine大概占用多少内存呢?今天无意间在《Concurrency Go》中看到了这段计算单个Goroutine内存占用大小的代码,分享给同样有迷惑人。 在Win7 Go1.9环境,大概是8.9KB~9.1KB,确实够小的。。。 package mainimport ("fmt""runtime""sync")func getGoroutineMemConsume() {

关于goroutine的一些小理解

前言 今天看一个大神的代码,看到了runtime.Gosched(),瞬间把我看懵了。。 后面梳理了下,其实这个竟然之前学习goroutine的时候没学到,所以顺便记录下,以便日后留恋。 知识点 理解这个goroutine必须要知道以下三大块东西。 进程、线程、协程并发、并行Golang中的M、P、G 我会用非常通熟易懂的方式来进行说明。(我也怕很烦的解释,不利于记忆啊!) 进程、

大话 goroutine

goroutine本质上是大号版的异步执行句柄,比之nodejs中的单线程事件循环处理器。之所以在使用goroutine,感觉不到异步,在于golang已经封装了各种异步io操作,运行时一旦发现异步io状态发生改变,则适时进行goroutine切换。让你基本上感觉不到像基于事件编程所带来的直观上的任务执行乱序。 启动 VS 执行 goroutine 这种由运行时控制,构建于线程之上,又比

10.1 Go Goroutine

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO系列: 记录博主学习GO语言的笔

go goroutine 进程 线程 协程

Go语言的协程——Goroutine 进程(Process),线程(Thread),协程(Coroutine,也叫轻量级线程) 进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”,它是CPU资源分配和调度的独立单位。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程

11 Goroutine-并发与并行、阻塞与非阻塞

并发 顺序执行:按照事先计划好的顺序,执行完一个操作后,再执行下一个操作。 顺序执行效率不高的原因: 每个操作由多个步骤组成,每个步骤所需要的时间长短不一,有些步骤可能相当耗时。顾客点菜需要时间,后厨做菜也需要时间,可否利用这些时间为更多顾客提供服务呢。 优化目标:减少不必要的闲置和等待,最大化处理机时间,提高工作效率 当一个操作执行到某个相当耗时的步骤时,转而执行其它操作中相对