【问题标题】:minimum work size of a goroutine [closed]goroutine 的最小工作量 [关闭]
【发布时间】:2010-12-16 12:49:13
【问题描述】:

有没有人知道大约需要多少最小工作量才能使 goroutine 发挥作用(假设有空闲内核可以卸载工作)?

【问题讨论】:

标签: parallel-processing go goroutine


【解决方案1】:

我一直在用 Go 艰难地完成 euler 项目。虽然我没有给你一个明确的答案,但我发现 Go 文档中基于 goroutine 的素数筛比简单地检查每个数字的素数要慢一个数量级。将 GOMAXPROCS 设置为更高的值也无济于事。

【讨论】:

  • 并行化仅在结果独立或可以分解为独立块的情况下有助于提高速度。然而,prime sieve 明确依赖于之前的结果:如果除了一个 goroutines 之外的所有 goroutines 在任何给定时间都阻塞,它就不是真正的并行。
【解决方案2】:

goroutine 是一种抽象,如果它可以帮助您更好地为应用程序建模,则可以使用它。您正在进行面向并发的编程,因此请考虑您的应用程序中具有并发性的部分。

考虑一个 OO 系统,并想象你是否应该实例化一个对象问同样的问题。

先做有意义的事。

【讨论】:

  • 确切地说,goroutines '只是'一个非常有用的概念抽象来组织你的程序。它们通过简化并行化来帮助提高性能只是一个很好的副作用。
【解决方案3】:

使用 goroutine 不仅仅关乎硬件效率。有时它们使软件更容易编写,并且更容易排除错误。该语言允许程序员自然而简单地表达并发性。这对我来说很有价值。

我自己对自然候选并发问题的经验是,通过简单的“分散/收集”方法,我可以轻松地在 CPU 绑定问题上最大限度地利用所有可用内核。您的里程可能会有所不同。

和亭

【讨论】:

    【解决方案4】:

    goroutine 是轻量级的,不会占用太多资源。您应该在适合问题的任何地方使用它们。目前 Go 在使用多核方面似乎并不是特别好(似乎在分配额外的主机线程时开销有点太大。)

    我认为真正的问题是何时使用多核而不是何时使用 goroutine。答案可能与其他语言和其他主机进程相同。 (不幸的是,你不能轻易地指定一个 goroutine 何时应该占用一个新的宿主进程或它应该占用哪个进程。)

    【讨论】:

    • go-routines 实际上并不分配新线程,因为这些例程在现有系统线程上是多路复用的。基本上归结为何时使用多核是有益的;但是,答案与其他语言不同,因为其他可比较的语言(c、c++、java)没有内置的并行结构,必须手动管理或使用像 openMP 这样的预编译器结构
    • 是的,我明白了。我的帖子评论了这样一个事实,即在不适合分配宿主进程的情况下使用 goroutines 时应该限制宿主进程的数量。
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2020-08-12
    • 2014-01-23
    • 1970-01-01
    相关资源
    最近更新 更多