当前位置: 首页 > 面试题库 >

最大例行程序数

归明诚
2023-03-14
问题内容

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

更新: 我刚刚对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的最大数量限制为略少于一百万。

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

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)
}


 类似资料:
  • 我试过下面的程序。创建此程序的目的是了解有关堆栈大小的更多信息。 执行上述代码后,由于堆栈大小分配过大,程序崩溃。堆栈的最大可能大小是多少?是否为每个程序/计算机固定?可以增加吗? 我想知道是为了知识。如果有人能提供C/C中的例子,那将是非常有帮助的。

  • 我有两个矩阵,如下所示: 我想找到一个向量,它是一个矩阵1*3,它的每一个元素都是M的每一行的最小元素乘以N的对应行的最大元素(例如,向量的第一个元素是矩阵M的第一行的最小元素,即1,乘以矩阵N的第一行的最大元素,即4,因此向量的第一个元素是1*4,即4)。最后的答案是:(1*4,1*3,1*4)=(4,3,4) 为了找到这个向量(或矩阵),我写了下面的代码: 但它太长了。有人能写一个更短(或更简

  • 本文向大家介绍Freemarker 最简单的例子程序,包括了Freemarker 最简单的例子程序的使用技巧和注意事项,需要的朋友参考一下 Freemarker 最简单的例子程序   freemarker-2.3.18.tar.gz http://cdnetworks-kr-1.dl.sourceforge.net/project/freemarker/freemarker/2.3.18/free

  • 一个谷歌应用引擎后端可以启动多少并行后台线程?我没有找到任何关于允许并行线程数量的信息。我在用Java做GAE。 我开始一个新的线程在文档中解释:[1] 如果我运行应用程序,一段时间后(在创建新线程时)会引发以下异常: 这个[2]问题提到,如果应用编程接口超出配额,就会出现这个异常。所以我可以创建线程,但是过了一定时间异常就会出现。这就是为什么我认为后端有线程的限制。 [1]https://dev

  • Android上的Flatter示例应用(发布版)是13MB的应用大小12MB的数据。为什么有12MB的数据?在iOS上,应用程序的大小甚至是47MB(我希望这是由于某种多架构的原因,但可能是最终大小)

  • 问题内容: 对SQL语句中要删除的行数应设置什么限制? 我们需要从1删除到几十万行,并且需要应用某种最佳实践限制,以便在每次清空废纸bas时不会绝对终止SQL Server或填充日志。 此问题并非特定于任何类型的数据库。 问题答案: 这是一个非常广泛的问题,基本上可以归结为“取决于”。影响它的因素包括: 您的并发级别是多少?delete语句在受影响的行上设置排他锁。根据数据库引擎,删除的数据分布等