专栏首页高性能分布式系统设计避免Goroutine频繁创建来提高性能

避免Goroutine频繁创建来提高性能

频繁的创建和销毁goroutine带来的开销不仅仅是goroutine创建和销毁本身.

更大的开销是由于goroutine的Stack一开始只有2KB, 而大部分复杂的业务都需要更多的Stack.

新创建goroutine, 还需要付出频繁扩展Stack的成本. 这个成本是巨大的.

如果最终需要128KB的栈,那么要扩6次stack. 期间需要复制和检查Stack当中的数据, 开销巨大.

以下的代码,可以把创建goroutine改成一个简单的入chan操作, 同时也避免的扩展Stack的操作, 成本就降低了很多.

var resolvers chan func()

func init() {
   resolvers = make(chan func(), 100)
   var f func()
   f = func() {
      defer f()
      j := <-resolvers
      j()
   }
   for i := 0; i < 100; i++ {
      go f()
   }
}

使用的代码如下:

resolvers <- func() {
   L(xxxx) // 这里是示意代码
}

----------------

Go语言的goroutine初始栈大小只有2K,如果运行过程中调用链比较长,超过的这个大小的时候,栈会自动地扩张。这个时候会调用到一个函数runtime.morestack。开一个goroutine本身开销非常小,但是调用morestack进行扩栈的开销是比较大的。想想,如果函数的栈扩张了,有人引用原栈上的对象怎么办?所以morestack的时候,里面的对象都是需要调整位置的,指针都要重定位到新的栈。栈越大,涉及到需要调整的对象越多,调用morestack的时候开销也越大。

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jython动态加载Jar

    用Jython做单元测试Java项目的时候,需要能动态的从Jar包里load类。 以下是一个简单的方法: import sys sys.path+=["...

    Linker
  • 一个值得关注的js项目:js-ipfs

    未来能在浏览器内,实现大部分IPFS的功能,对于IPFS的推广有很大的好处。尤其是可以用于CDN领域。

    Linker
  • 基于 CSP 的设计思想和 OOP 设计思想的异同

    Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视。标准库的很多设计保留了很浓的OOP的味道。本篇Blog想比较下从设计的...

    Linker
  • oh-my-zsh快捷命令配置

    小胖
  • 产品资讯|腾讯优图人脸融合新功能重磅来袭,“疯狂变脸”让生活更有趣味

    随着科技的日益进步,越来越多的“黑科技”在便利人们生活的同时,也为社交娱乐领域带来了更多更有趣的玩法。“明星合照”、“未来20年后的你”“我的军装照”这些耳熟能...

    优图实验室
  • python接口自动化16-multipart/form-data上传多个附件

    前言 reuqests上传一张图片到服务器,前面已经介绍过了,那么如何在提交BUG的时候,上传附件呢? 上传附件的时候,文件的name参数名称是一样的,pyth...

    企鹅号小编
  • 多云数据管理深度实践中 | 配置OpenSDS多后端(LVM、Cinder、Ceph)

    上篇文章我们通过Ansible安装了OpenSDS,本文我们继续深入了解OpenSDS,相信细心的童鞋会发现我们上篇在简短介绍OpenSDS的时候说到了可以纳管...

    DevinGeng
  • VisualStudio 使用三个方法启动最新 C# 功能 第一个方法第二个方法第三个方法

    本文告诉大家如何在 VisualStudio 打开最新的 C#,现在的微软更新 C# 很快,那么如何让 VisualStudio 在项目使用最新的

    林德熙
  • Activiti6.0(一)工作流入门

    工作流:是对工作流程及其各操作步骤之间业务规则的抽象、概括描述 工作流建模:即将工作流程中的工作如何前后组织在一起的逻辑和规则,在计算机中以恰当的模型表达并对...

    楠楠
  • 为Python云函数打包依赖

    在使用无服务器云函数(SCF)的时候通常会遇到导入第三方库的时候,这个时候很多小伙伴就比较头疼:我如何打包进去呢?其实这里有几个方法可以尝试。

    Dfounderliu

扫码关注云+社区

领取腾讯云代金券