最大 goroutine 数量

2023-11-29

我可以无痛地使用多少个 goroutine?例如维基百科说,在 Erlang 中可以创建 2000 万个进程而不会降低性能。

Update:我刚刚研究 goroutine 性能一点点,得到了这样的结果:

  • 看起来 goroutine 的生命周期比计算 sqrt() 1000 次要长(对我来说约为 45μs),唯一的限制是内存
  • Goroutine 花费 4 — 4.5 KB

如果一个 goroutine 被阻塞,除了以下之外不会涉及任何成本:

  • 内存使用情况
  • 垃圾收集速度较慢

成本(就内存和实际开始执行 goroutine 的平均时间而言)是:

Go 1.6.2 (April 2016)
  32-bit x86 CPU (A10-7850K 4GHz)
    | Number of goroutines: 100000
    | Per goroutine:
    |   Memory: 4536.84 bytes
    |   Time:   1.634248 µs
  64-bit x86 CPU (A10-7850K 4GHz)
    | Number of goroutines: 100000
    | Per goroutine:
    |   Memory: 4707.92 bytes
    |   Time:   1.842097 µs

Go release.r60.3 (December 2011)
  32-bit x86 CPU (1.6 GHz)
    | Number of goroutines: 100000
    | Per goroutine:
    |   Memory: 4243.45 bytes
    |   Time:   5.815950 µs

在安装了 4 GB 内存的机器上,这将 goroutine 的最大数量限制为略低于 100 万个。


源代码(如果您已经了解上面打印的数字,则无需阅读此内容):

package main

import (
    "flag"
    "fmt"
    "os"
    "runtime"
    "time"
)

var n = flag.Int("n", 1e5, "Number of goroutines to create")

var ch = make(chan byte)
var counter = 0

func f() {
    counter++
    <-ch // Block this goroutine
}

func main() {
    flag.Parse()
    if *n <= 0 {
            fmt.Fprintf(os.Stderr, "invalid number of goroutines")
            os.Exit(1)
    }

    // Limit the number of spare OS threads to just 1
    runtime.GOMAXPROCS(1)

    // Make a copy of MemStats
    var m0 runtime.MemStats
    runtime.ReadMemStats(&m0)

    t0 := time.Now().UnixNano()
    for i := 0; i < *n; i++ {
            go f()
    }
    runtime.Gosched()
    t1 := time.Now().UnixNano()
    runtime.GC()

    // Make a copy of MemStats
    var m1 runtime.MemStats
    runtime.ReadMemStats(&m1)

    if counter != *n {
            fmt.Fprintf(os.Stderr, "failed to begin execution of all goroutines")
            os.Exit(1)
    }

    fmt.Printf("Number of goroutines: %d\n", *n)
    fmt.Printf("Per goroutine:\n")
    fmt.Printf("  Memory: %.2f bytes\n", float64(m1.Sys-m0.Sys)/float64(*n))
    fmt.Printf("  Time:   %f µs\n", float64(t1-t0)/float64(*n)/1e3)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大 goroutine 数量 的相关文章

随机推荐

  • 如何改变变量赋值的较低索引?

    我想对具有较低索引的变量进行赋值 这就是我想做的 int i logic 63 0 data i someCalculatedNumber data 63 i 8 h0 我知道这不会编译 完成这项任务的最佳方法是什么 如果您希望将 LSB
  • 快速获取服务器时间

    有没有办法让服务器时间与 swift 我想根据服务器设置静态时间 这样 即使用户更改时区和日期 也没关系 视图控制器上显示的时间将是基于服务器的时间而不是 NSDate let today NSDate println today 目前 如
  • 对 pandas 列的多个子集高效运行回归分析

    我本可以选择一个较短的问题 只关注这里的核心问题 即列表排列 但我带来的原因统计模型 and pandas问题是 可能存在用于逐步回归的特定工具 同时具有存储所需回归输出的灵活性 就像我将在下面向您展示的那样 但效率更高 至少我希望如此 给
  • Json.net - 填充字典时如何保留字典值引用?

    我想从 JSON 文件填充字典中包含的对象 同时保留对象引用本身 Json net 关于 PreserveReferencesHandling 的文档明确指出 如果类型实现 System Runtime Serialization ISer
  • 是否有一个 java 类用于使用日期构造 cron 表达式?

    我需要根据表单中的用户输入构建一个 cron 表达式 所以我有一个日期选择器和一个选择框来选择频率 我可以很容易地从中构建一个 cron 表达式 但感觉就像我在重新发明轮子 有适合我的课程吗 类似方法的东西 public String cr
  • 检测键控状态变化

    我是数据流编程模型的新手 在思考我认为应该是一个简单的用例时遇到一些困难 我有一个从 Pub Sub 读取实时数据的管道 该数据包含带有 简化的 序列号和状态 UP 或 DOWN 的设备状态 保证设备至少每 5 分钟发送一次其状态 但设备当
  • 如何获取从最后一个匹配到文件末尾的行?

    需要打印最后一个匹配之后到文件末尾的行 比赛的数量可以是任意的 并且是不确定的 我有一些文字 如下所示 MARKER aaa bbb ccc MARKER ddd eee fff MARKER ggg hhh iii MARKER jjj
  • 如何在varchar中查找5位数字?

    基本上我只需要得到一个由空格分隔的 5 位数字 5 位数字可以位于 varchar 中的任何位置 示例 我有一个 varchar 列 其中包含 SQL 2008 表中的各种数据 travel visa 34322 LLL001 Coffee
  • 更改 .each() 在 Firefox 和 chrome 中的顺序

    我有一个返回 JSON 编码数据数组的 Web 服务 然后我使用 jQuery 的 each 函数来迭代该数组 但在 Firefox 中它向下迭代 而在 Chrome 中它向上迭代 从网络服务返回的数据是 data 610 id 610 u
  • 整数的scanf获取字符时如何处理异常

    当输入是字符时 下面的简单程序将给出无限循环 尽管它意味着区分字符和数字 如何测试是否scanf使用返回值获取应该是数字的字符scanf include
  • while 循环中更改的标签不会更新 UI

    运行此代码时 using System using System Collections Generic using System Linq using System Text using System Windows using Syst
  • php中require和require_once之间的区别[重复]

    这个问题在这里已经有答案了 require 和 require once 之间的区别 我只是想知道其中的区别 而不是 php 中的警告和致命错误 require 包含并评估特定文件 同时require once 仅当之前未包含该内容 在同一
  • 删除“购物车为空时无法结帐”。 WooCommerce 中的通知

    我应该添加什么代码functions php删除 购物车为空时无法结账 Woocommerce 中的通知 我在中找到了代码包括 wc template functions php负责显示此消息 When on the checkout wi
  • 将特定位图图像颜色转换为透明

    我目前正在重新创建我的图像资源管理器应用程序 该应用程序以前是在 Windows 窗体中编写到 Windows 演示框架中的 我的 WinForms 应用程序使用 DanielPe alba 的 WindowsThumbnailProvid
  • 如何使用 Powershell 从 XML 中删除特殊/坏字符

    我有一个 XML 文件 我想从下面的文件中删除这些十六进制字符错误是无效字符 我不知道 STX 是什么意思 当我尝试将其复制到剪贴板并将其粘贴到 MS Work 中时 它显示了一些其他值 如何在 powershell 中编写脚本以从 XML
  • 在 R 中应用成本函数

    我正处于 R 机器学习的初级阶段 我很难相信没有包可以解决不同类型回归算法的成本函数 例如 如果我想求解逻辑回归的成本函数 手动方法如下 https www r bloggers com logistic regression with r
  • 在两个列表上使用 java 流进行左连接

    主类的最佳描述这是课程描述的图片我有一个包含 cid cname 和 aid 的实体客户 另一个包含 help 城市和州的实体地址 我已经在两个不同的列表 list 和 list 中获取了两个实体的数据 我想要一个结果列表 客户和地址上的左
  • Android 2.3.3中的Http get请求

    我需要发送方面的帮助HTTP GET要求 我的代码如下 URL connectURL new URL url HttpURLConnection conn HttpURLConnection connectURL openConnectio
  • 递归连接父属性

    给定以下 XML
  • 最大 goroutine 数量

    我可以无痛地使用多少个 goroutine 例如维基百科说 在 Erlang 中可以创建 2000 万个进程而不会降低性能 Update 我刚刚研究 goroutine 性能一点点 得到了这样的结果 看起来 goroutine 的生命周期比